迭代C ++中方法的返回值

时间:2013-03-18 19:04:07

标签: c++

假设我有一个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
}

3 个答案:

答案 0 :(得分:6)

不,这不好,因为你在返回它时会对向量进行复制,所以你要比较的迭代器会引用不同的容器,这是未定义的行为。

你可以只返回一个(const - )引用,但是为你的类正确地重载beginend而不是暴露向量会更加清晰。

答案 1 :(得分:1)

我认为myBar应为myFoo且类型为Foo

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

答案 2 :(得分:1)

每次调用它时,

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

你可能想要返回一个参考:

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

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