在成员函数返回的向量上调用begin和end

Hum*_*awi 0 c++ iterator vector c++11

我有这门课:

class foo{
public:
    const std::vector<int> get_v() const{
         return v_;
    }
private:
    std::vector<int> v_
};
Run Code Online (Sandbox Code Playgroud)

我能这样用吗?

int main(){
    foo f;
    some_non_inplace_std_function(f.get_v().cbegin(),f.get_v().cend());
}
Run Code Online (Sandbox Code Playgroud)

第一个f.get_v()指向第二个相同的向量f.get_v()吗?

jua*_*nza 6

get_v()按值返回,因此每次调用它时都会获得原始副本.这意味着从不同调用获得的开始和结束迭代器get_v()不属于同一序列.

如果你真的打算按值返回,那么你需要复制结果才能使用迭代器对:

auto v = f.get_v();
some_non_inplace_std_function(v.cbegin(), v.cend());
Run Code Online (Sandbox Code Playgroud)

否则,您可以通过引用返回,或直接从中返回迭代器或迭代器范围对象foo.

const std::vector<int>& get_v() const{ ... }
Run Code Online (Sandbox Code Playgroud)

要么

struct foo{
    std::vector<int>::const_iterator begin() const{ return v_.begin(); }
    std::vector<int>::const_iterator end() const{ return v_.end(); }
 ....
private:
    std::vector<int> v_
};
Run Code Online (Sandbox Code Playgroud)