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

时间:2017-02-10 07:32:52

标签: c++ c++11 vector iterator

我有这堂课:

   org.gradle.jvmargs = -Xmx5120m

我可以像这样使用它吗?

class foo{
public:
    const std::vector<int> get_v() const{
         return v_;
    }
private:
    std::vector<int> v_
};

第一个int main(){ foo f; some_non_inplace_std_function(f.get_v().cbegin(),f.get_v().cend()); } 是否指向第二个f.get_v()的相同向量?

4 个答案:

答案 0 :(得分:6)

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

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

auto v = f.get_v();
some_non_inplace_std_function(v.cbegin(), v.cend());

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

const std::vector<int>& get_v() const{ ... }

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_
};

答案 1 :(得分:4)

const std::vector<int> get_v() const{
     return v_;
}

您将返回矢量v_的副本。您可能希望返回对v_

的引用
const std::vector<int>& get_v() const{
     return v_;
}

答案 2 :(得分:3)

每次打电话get_v时,都不会制作新副本。要解决此问题,您可以返回一个const引用:

 const std::vector<int>& get_v() const { return v_; }

答案 3 :(得分:2)

您应该更改为返回引用,如

const std::vector<int>& get_v() const {
     return v_;
}