2017-02-10 7 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

ありませんへの参照を返すたびに、一時的なベクトルとコピーに' FOO :: v_'を作成get_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

あなたは、ベクターv_のコピーを返却する

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

同様の参照を返すように変更する必要があります。あなたは `、v_

const std::vector<int>& get_v() const{ 
    return v_; 
} 
関連する問題