c++ - 为什么 vector 被视为按值传递,即使它是通过 const 引用传递的?

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

我最近在编写一个非常简单的 class ,它负责在 std::vector 中找到最小值和最大值并发现,即使我将收藏作为 const reference 传递到 class ' 构造函数,然后从外部更改 vector (即,将一个元素插入其中或从中删除一个元素),即 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 的值将是 -326 , max 的值将是 158 , 尽管很明显值 9999999158 大得多.

我设法通过更改私有(private)成员的定义来修复此行为 numbersstd::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++ - 为什么 vector 被视为按值传递,即使它是通过 const 引用传递的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33079378/

相关文章:

c++ - 将 std::tuple 转换为 std::array C++11

C++概念不好用?

java - 访问数组中的对象

java - 什么时候使用静态方法和字段?

java - 如何使用setter为私有(private)数组的属性设置值?

c++11 - 正则表达式匹配

c++ - glDrawElements 错误 : nvoglv32. dll OpenGL

c++ - 无法使用 while 运行循环

c++ - 计算大小增加的 vector 的平均值

c++ - 编译器不会对屏蔽类进行常量折叠