2017-10-10 1 views
0

のベクターに新しい要素を追加する際にデフォルト以外のコンストラクタを使用して、私はこのように、別のクラスからオブジェクトのベクトルを持っている:<class>オブジェクトクラスで

class Foo { 
private: 
    std::vector<Bar> barObject; 
... 
}; 

クラスのバーがデフォルトを定義しますコンストラクタ(すべてのプライベート変数がゼロに初期化)、および値で供給することができる非デフォルトコンストラクタは、のように:

Fooクラスで
Bar newBar(var1, var2); 

、barObjectベクトルはサイズを指定せずに宣言されています。

私はデフォルトのコンストラクタを使用したい場合は、私はちょうど行うことができます推測している。その後、

barObject.resize(barObject.size()+1); 

と私はのようなベクトル何かにbarObjectのプライベート変数を変える:

barObject.at(i).SetVar(value) 

しかし、デフォルト以外のコンストラクタを使用してプライベート変数の値を入力したい場合は、次のようにしてください:

barObject.insert(i, tempBar); 

tempBarは、barObjectの位置iに必要なプライベート値を持つBarクラスのオブジェクトですか?

+0

散文を伴う少なすぎるコード:

barObject.insert(i, tempBar); 

をちょうどイテレータiが有効なものであることを確認してください。できるだけ多くの[mcve]を作ってください。 – Yunnosch

+0

@Yunnoschたくさんのコード!=より良い質問。それは常に黒と白ではありません。 – Rakete1111

+2

@ Rakete1111真実だが、コードを記述することによって(有用であるが)、コードを示すことできれいに増やすことができる。 – Yunnosch

答えて

2

resizeは、過負荷を持っています

void resize (size_type n, const value_type& val);

これは、あなたが新しく割り当てられたメモリ内の値を指定することができます。ただし、ベクトルを構築の一部として割り当てる場合は、同様に行うことができます。ベクターは、これを行うには、コンストラクタを持っています

class Foo { 
public: 
    Foo() : barObject(17, Bar(4, 5)) {} // Creates a 17 length array 
}; 

あなたは自分のすでに構築さvectorを使用する場合:

vector (size_type n, const value_type& val, 
     const allocator_type& alloc = allocator_type()); 

次に、あなたがしなければならないすべては、一度だけ、ベクターを構築するために均一な初期化構文を使用しています最後に要素を追加するには、push_backまたはemplace_backを使用します。あなたは、挿入の場所にイテレータを作るために必要になるだろう、インサートを使用するためには

あなたが使用できるベクトル内の値のいずれか at()機能または変更するために
auto myIt = barObject.begin() + 3; 
myIt = barObject.insert(myIt, 5, Bar(6, 7)); // Inserts 5 objects at offset 3, and increases its size by 5. 
myIt += 6; 
myIt = barObject.insert(myIt, Bar(8, 7)); // Inserts 1 object at offset 9 (not offset 14), and increases its size by 1. 

operator[]関数:

barObject.at(3) = Bar(4, 5); 
barObject[3] = Bar(4, 5); 

両者の差が.at()ある境界チェックはありません。一方、operator[]はそうではありません。

-1

ご質問の回答。はい、あなたは、インサートのようなもの行うことができます。

std::vector<Bar>::iterator i = barObject.begin(); 
barObject.insert(i, tempBar); 
+1

@Mooing Duck vector :: insertはイテレータを使用します – StahlRat

関連する問題