为什么将向量视为通过值传递,即使它是由const引用传递的?

And*_*ndy 1 c++ oop reference vector c++11

我最近编写了一个非常简单的代码class,它负责查找a中的min和max值std::vector,即使我将集合作为a const reference传递给class'构造函数然后更改向量(即将元素推入其中)或者从外面移除一个),内部的向量class保持不变.

#include <vector>
#include <algorithm>

class MinMaxFinder
{
public:
    MinMaxFinder(const std::vector<int>& numbers) : numbers(numbers)
    {
    }
    const int Min() const
    {
        this->findMinAndMax();
        return this->min;
    }
    const int Max() const
    {
        this->findMinAndMax();
        return this->max;
    }

protected:
    std::vector<int> numbers;
    int min;
    int max;

    void findMinAndMax()
    {
        // std::minmax_element call to find min and max values
    }
};
Run Code Online (Sandbox Code Playgroud)

我认为传递引用的点是为了不复制大对象,但是我的代码现在的工作方式似乎是复制集合.

#include <vector>
#include <iostream>
#include "MinMaxFinder.h"

int main(int argc, char* argv[])
{
    std::vector<int> v{ 1, -6, 12, 158, -326 };
    MinMaxFinder mmf(v);

    v.push_back(-9999999);
    v.push_back(9999999);

    auto min = mmf.Min();
    auto max = mmf.Max();
}
Run Code Online (Sandbox Code Playgroud)

的价值min将是-326,价值max将是158,即使是很清楚,该值9999999远远大于158.

我设法解决通过改变私有成员的定义这种行为numbersstd::vector<int>& numbers,但它是正确的解决方案?

仍然,为什么内部集合的状态仍然没有变化,它是否不会违反const ref的传递定义?

Dav*_*aim 6

std::vector<int> numbers;应该const std::vector<int>& numbers;这样你引用一个对象而不复制它或具有更改它的能力.

但是说真的,这堂课有什么意义呢?巨大的矫枉过正!只是使用std::min_elementstd::max_elementstd::minmax_element..

auto minimun = std::min_element(numbers.begin(),numbers.end());
Run Code Online (Sandbox Code Playgroud)