c++ - 为什么即使将const引用传递给 vector ,也将其视为被值传递?

原文 标签 c++ oop c++11 vector reference

我最近编写了一个非常简单的class,它负责在std::vector中查找最小值和最大值,并发现,即使我将集合作为const reference传递给class'构造函数,然后更改 vector (即,push元素或从中删除一个元素),class内部的 vector 保持不变。

#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
    }
};

我认为传递引用的目的是避免复制大对象,但是我的代码现在的工作方式似乎复制了集合。
#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();
}
min的值将为-326max的值将为158,即使很明显9999999的值比158大得多。

我设法通过将私有(private)成员numbers的定义更改为std::vector<int>& numbers来解决此问题,但这是正确的解决方案吗?

但是,为什么内部集合的状态仍保持不变,这不违反const ref传递的定义吗?

最佳答案

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());

相关文章:

c++ - 创建double vector 的排名

php - 从父范围访问子属性

python - Python静态方法,为什么?

javascript - 计算PHP的月度套餐(产品)价格

c++ - 如何在Xcode 9.3中显示C++代码文档?

c++ - 使用默认值增强程序选项

c++ - C++ unique_ptr和数组

c++ - 2D数组C++的列迭代器

c++ - 在函数而不是::运算符中打印全局变量的任何替代方法

c++ - C++覆盖继承的方法