我最近在编写一个非常简单的 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
, 尽管很明显值 9999999
比 158
大得多.
我设法通过更改私有(private)成员的定义来修复此行为 numbers
至 std::vector<int>& numbers
, 但这是正确的解决方案吗?
但是,为什么内部集合的状态保持不变,这不是违背了通过 const ref 传递的定义吗?
最佳答案
std::vector<int> numbers;
应该是 const std::vector<int>& numbers;
通过这种方式,您可以引用一个对象而无需复制它或具有更改它的能力。
但是说真的,这门课的意义何在?大材小用!只需使用 std::min_element
和 std::max_element
或 std::minmax_element
..
auto minimun = std::min_element(numbers.begin(),numbers.end());
关于c++ - 为什么 vector 被视为按值传递,即使它是通过 const 引用传递的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33079378/