假设我有一个Foo类:
class Foo {
public:
std::vector<Bar> barVec() const {return barVec_;}
private:
std::vector<Bar> barVec_;
};
其中Bar是其他类。因此,在Foo之外,对barVec_的唯一访问是通过方法barVec()。
如果myFoo是Foo的一个实例,而pred是Bar上的一元谓词,那么可以这样做:
auto i = find_if(myFoo.barVec().begin(), myFoo.barVec().end(), pred);
if (i != myFoo.barVec().end()) {
//do some stuff here
}
或者我是否必须将myFoo.barVec()分配给变量并迭代该变量?例如:
std::vector<Bar> tmp = myFoo.barVec();
auto i = find_if(tmp.begin(), tmp.end, pred);
if (i != tmp.end()) {
//do some stuff here
}
答案 0 :(得分:6)
不,这不好,因为你在返回它时会对向量进行复制,所以你要比较的迭代器会引用不同的容器,这是未定义的行为。
你可以只返回一个(const
- )引用,但是为你的类正确地重载begin
和end
而不是暴露向量会更加清晰。
答案 1 :(得分:1)
我认为myBar
应为myFoo
且类型为Foo
。
您必须先将其分配给std::vector<Bar>
对象。问题是myFoo.barVec()
返回myFoo
内存储的向量的副本。您barVec
行中对find_if
的每次调用都会返回一个不同的临时std::vector<Bar>
对象。这两个临时对象的begin
和end
迭代器不适用于相同的序列。这意味着您有未定义的行为。
答案 2 :(得分:1)
Foo::barVec()
都会返回一个向量的副本。因此,对Foo::barVec().begin()
和Foo::barVec().end()
的两次调用返回的迭代器属于不同的对象。
你可能想要返回一个参考:
const std::vector<Bar>& barVec() const {return barVec_;}
但您应该考虑返回提供直接从类中返回begin()
和end()
迭代器的方法,而不是公开底层的矢量数据成员。