2017-02-02 5 views
0

私はstd :: vector of C++を学習しています。 std :: vectorのoperator []に2つの問題があります。私はオペレータ[]でのstd :: vecotrの値n番目を設定仮定C++でstd :: vectorのn番目の値をoperator []で正しく設定できますか?

(1)値n番目の前の要素が初期化されていません。

(2)n番目の値は演算子[]で設定できますが、サイズと反復子は正しく変更されません。

以下はテストコードです。

/* Test class : its has only id_ and it can print it. */ 
class Tmp { 
public : 
    Tmp(int new_id) : id_(new_id) { 
     std::cout << "class Tmp constructor. id = " << id_ << std::endl; 
    } 
    void print(void) { 
     std::cout << "id = " << id_ << std::endl; 
    } 
private : 
    int id_ = 777; 
}; 

std::vector<Tmp> b; 

b.reserve(1); 

/* push_back() automatically expands buffer of std::vector. */ 
b.push_back(Tmp(1)); 
b.push_back(Tmp(2)); 
b.push_back(Tmp(3)); 
b.push_back(Tmp(4)); 
b.push_back(Tmp(5)); 

std::cout << "Before operator[] : size = " << b.size() << ", capacity = " << b.capacity() << std::endl; 

/* I set the 7 th value. */ 
b[6] = Tmp(7); 
b[6].print(); 

/* Operator[6] does not change size of std::vector. */ 
std::cout << "Before operator[] : size = " << b.size() << ", capacity = " << b.capacity() << std::endl; 

/* Operator[6] did not expand iterator of std::vector correctly. */ 
for (auto it = b.begin(); it != b.end(); ++it) { 
    it->print(); 
} 

その出力、

class Tmp constructor. id = 1 
class Tmp constructor. id = 2 
class Tmp constructor. id = 3 
class Tmp constructor. id = 4 
class Tmp constructor. id = 5 
Before operator[] : size = 5, capacity = 8 
class Tmp constructor. id = 7 
id = 7 
After operator[] : size = 5, capacity = 8 
id = 1 
id = 2 
id = 3 
id = 4 
id = 5 

私はオペレータ[N]によってN番目のstd ::の値ベクトルを設定することができ、以下の通りでありますか? 私はそれを行うことができます、どのようにn番目の値の前に値を初期化できますか?

ありがとうございました。

+1

なぜ 'vector <> :: operator []'はサイズを変更すると思いますか? –

+1

'operator []'で新しい要素を作成することはできません。既存の要素を更新する場合にのみ使用できます。 from http://www.cplusplus.com/reference/vector/vector/operator[]/ **ポータブルプログラムは、未定義の動作を引き起こすので、範囲外の引数nでこの関数を呼び出さないでください。** – Barmar

+1

'operator []'へのすべての呼び出しを '.at()'に置き換えることができます。何が起こるかを見てください。 –

答えて

1

はい、演算子[]でN番目の値を設定できます。ただし、要素は既に存在している必要があります(pos < size())。いくつかの疎なデータ構造(またはstd :: map)とは異なり、vectorを使用すると、operator []は要素を追加しません。

要素は、通常、push_back、insert、またはresize(assign、emplace、emplace_back ...)で追加されます。 resizeには、追加された要素の初期値を指定するオプションの第2引数があります。

はあなたの例を考えると、あなたはできます

std::vector<Tmp> b; 
b.resize(7, Tmp(-1)); 
b[6] = Tmp(6); 

要素0-5は現在、_idでのTMPインスタンスを含む== -1ます。同様のコンストラクタもあり

、このコードは同じものを達成する:

std::vector<Tmp> b(7, Tmp(-1)); 

のstd ::コンテナのサイズを変更しない::予備ベクターは、それだけで十分な内部配列が大きいプリ割り当てますその容量内の要素を追加するには、ベクトルを再割り当てする必要はありません。

+0

解決策を教えてくれてありがとう。 – mora

関連する問題