2017-12-01 3 views
1

を修正するために、ベクトル::バック()を使用する:私はに要素を追加しようとしています私は、次の構造体持っているベクトル要素

std::vector<A> a_vector; 

#include <string> 
#include <vector> 

struct A { 
    std::string name; 
    int id; 
}; 

と要素を含むベクトルをベクトルを計算し、その値を次のように変更します。

void test() 
{ 
    A a; 
    get_a(a); 

//Up to this point I thought modifying this a object would mean modifying the back element of the vector. But it doesn't work as planned, doing this: 

    a.id = 2; //Doesn't modify the id of the element in the vector. 
} 

ここで、get_aは次のように定義されています。本当にどのように私は要素がベクトル内の1つのと同じで持つように行うことができます

void get_a(A& a) //This function normally assigns a in different ways 
{ 
    a_vector.emplace_back(); 
    a = a_vector.back(); 
} 

)の引数として渡すとリターンとしてそれを取得しないする必要がありますか?私は本当にポインタを使用する必要がありますか?

+1

あなたがそのコピーを作成しているためです。それを言います。 refereneceを使用してください:A&a = a_vecotr.back(); – Ondrej

+2

なぜdownvotes?私たちは自明性の理由で投票していますか?この質問はよく書かれています。 – Bathsheba

+0

みんなあなたがdownvoteするときに私はしばらくの間、さらなる質問をすることを禁じています。 :/ –

答えて

6
A a; 
a = a_vector.back(); 

あなたはaにコピー割り当てるa_vector.back()です。これは参照ではないため、aを変更しても、ベクトル内の要素は変更されません。

あなたはこの代わりにしたい:あなたはすぐに a_vector.back()であなたの参照を初期化することができない場合

A& a = a_vector.back(); 

は、ポインタを使用することを検討して...

A* a; 

// ... 

a = &a_vector.back(); 

// ... 

something(*a); 

...またはインデックスを:

std::size_t a_idx; 

// ... 

a_idx = a_vector.size() - 1; 

// ... 

something(a_vector[a_idx]); 
  • ベクトルのサイズが変更されないことがわかっている場合、ポインタは正常に動作します。ベクトルのサイズを変更すると、イテレータとポインタは無効になります。

  • 要素が削除/移動されない限り、ベクトルのサイズが変更されてもインデックスは正常に機能します。

+0

ありがとうございました!しかし、2つの異なるステートメントで参照宣言と参照の割り当てを行うことはできますか? (質問編集EDITを参照) –

+0

@hamzakeurti:私の編集を参照してください。 –

3

あなたは、オブジェクトへの参照が必要になります。

auto& a = a_vector.back(); 

あるいは、よりコンパクトに:

a_vector.back().id = 2; 

あなたは元のオブジェクト、コピーを保持していません。そのため、ベクトルのオブジェクトは変更されません。


編集の質問への回答:参照は宣言時にのみ割り当てることができます。あなたが欲しいのはおそらくstd::reference_wrapperですが、とにかくそれが必要な場合以外は使用しないでください。ここで

+0

答えをありがとう!しかし、2つの異なるステートメントで参照宣言と参照の割り当てを行うことはできますか? (編集の質問を参照) –

+0

@hamzakeurti、編集を参照してください。 – Incomputable

関連する問題