0

假设我有一个像这样的 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
}
4

3 回答 3

6

不,这是不行的,因为您在返回向量时复制了向量,因此您正在比较的迭代器引用不同的容器,这是未定义的行为。

您可以只返回一个 ( const-) 引用,但重载beginend适合您的类更干净,而不是暴露向量。

于 2013-03-18T19:08:14.400 回答
1

我认为myBar应该是myFoo并且是类型Foo

您必须先将其分配给std::vector<Bar>对象。问题是myFoo.barVec()返回存储在里面的向量的副本myFoobarVec您的行中的每个调用都find_if将返回一个不同的临时std::vector<Bar>对象。这两个临时对象的beginend迭代器不适用于同一序列。这意味着您有未定义的行为。

于 2013-03-18T19:07:52.977 回答
1

Foo::barVec()每次调用它时都会返回一个向量的副本。因此,两次调用返回的迭代器Foo::barVec().begin()属于Foo::barVec().end()不同的对象。

您可能打算返回一个参考:

const std::vector<Bar>& barVec() const {return barVec_;}

但是您应该考虑返回直接从您的类返回begin()end()迭代器的提供方法,而不是公开底层向量数据成员。

于 2013-03-18T19:09:23.853 回答