2017-02-10 83 views
0

返回的矢量結束我有這個類:呼籲開始,由成員函數

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()點到第二f.get_v()的相同矢量?

+1

沒有,'get_v'每次創建一個臨時載體和複製'FOO :: v_'成。 –

回答

3

沒有你每次撥打電話get_v時都要複印一份。按值

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

get_v()回報,所以每次調用時你原來的新副本:爲了解決這個問題,你可以返回一個const引用。這意味着從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_ 
}; 
2

你應該改變像

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

您正在返回矢量v_複印件退回參考。您可能要返回參考v_

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