【发布时间】:2015-10-12 10:56:34
【问题描述】:
我最近编写了一个非常简单的class,它负责在std::vector 中查找最小值和最大值,结果发现,即使我将集合作为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
}
};
我假设传递引用的目的是不复制大对象,但是我的代码现在的工作方式似乎确实复制了集合。
#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。
我设法通过将私有成员 numbers 的定义更改为 std::vector<int>& numbers 来解决此问题,但这是正确的解决方案吗?
但是,为什么内部collection的状态会一直保持不变,这不违背const ref传递的定义吗?
【问题讨论】:
-
您的类中的 vector 不是 引用,因此它接收 vectorcopy /i> 通过引用传递给构造函数。
-
@Galik:请不要在 cmets 部分写答案。下面有三个很好的答案,它们所属的地方。
-
@LightnessRacesinOrbit 对于答案来说太琐碎了,很可能是错字。
-
@Galik:无关紧要。 答案不在 cmets 部分中。如果您认为这个问题太琐碎而无法回答,不要回答!!!!!! 您是在故意违反 Stack Exchange 模型!此外,我不认为这是一个错字。
-
@LightnessRacesinOrbit 那么我们应该如何发现一个问题是否应该在没有一些 cmets 的情况下基于它是“一个简单的印刷错误”而关闭?每次我们怀疑有错别字时,我们都必须提供答案吗?
标签: c++ oop c++11 vector reference