2012-03-27 9 views
0

オブジェクトのベクトルを宣言したいとします。私はこのようにすることができます -ベクターにオブジェクトを効率よく正しく挿入する方法

vector<mynode> nodes; 

しかし、mynodeのサイズが大きい場合、これは悪いです。だから私は、このようにそれをやって考える -

vector<mynode*> nodes; 

しかし、上記の宣言は、私はアドレスを格納しています明らかに問題があり、それがすべてで安全ではありません。私はfoorループ内のオブジェクトを追加した場合たとえば、 - ポインタの内容は、実際にOKであれば、私が保証することはできませんよう

vector<mynode*> nodes; 
for (int i=0; i<10; i++) 
{ 
    mynode mn; 
    nodes.push_back(&mn); 
} 

これは、エラーが発生します。これはokです

vector<mynode&> nodes; 
for (int i=0; i<10; i++) 
{ 
    mynode mn; 
    nodes.push_back(mn); 
} 

-

だから、私はこの宣言を使用することを決定しますか?安全?これは、最初の行自体をコンパイルします。オブジェクトをベクターに格納する効率的な方法を提案してください。どうもありがとう。

+1

いいえ、参照による格納は、ポインタによる格納とまったく同じです。挿入が頻繁でプログラムの速度が遅い場合は、別のデータ構造体( 'deque'?)または' std :: vector > 'を使用することを検討してください。また、あなたの質問名は質問自体と一致しません。 –

+3

プロファイリングが実際の問題であることが示されていない限り、ベクトルの最適化について心配する必要はありません。最初のフォーム 'ベクトル'が最善です。 –

+0

@ MooingDuckでは、参照を再割当てできないため、参照を格納することはできません。 –

答えて

3

私は、このようにそれを行うことができます -

vector<mynode> nodes; 

しかしMYNODEのサイズが大きい場合、これは悪いだろう。

いいえ、そうではありません。とにかくオブジェクトを格納する必要があります。

  1. 使用std::vector<std::unique_ptr<my_node>>(または別のスマートポインタ)が自動的に破壊上のオブジェクトを解放し、:あなたはコピー大きなオブジェクトを心配しているならば、あなたはいくつかのソリューションを持っています。 my_nodeが多型である場合、これが最良の解決策です。
  2. std::vector<my_node>を使用し、emplace_back関数を使用してオブジェクトを作成します(Visual Studio 2010を使用している場合は、この機能は実行されません)。
  3. さらにstd::vector<my_node>を使用して既に構成されたオブジェクトを移動させる

    v.push_back(std::move(some_node));

    のように、右辺値参照しpush_backを使用します。

とにかく、親指の良いルールは、ほとんどの非軽量のオブジェクトのコピーコンストラクタ/削除譲渡(またはプライベート)を持つことです。コンテナはまだ機能しています(C++ 11を使用しています)、あなたの懸念事項は疑問です。

+0

空白を 'std :: vector >' – stanwise

+1

@stanwise:C++ではなく11に追加します。 –

+0

このアップデートを逃しました。ありがとうございます。 – stanwise

0

ここでポインタが悪いとは思わない。それは無効ではありません。あなたの例のように参照を挿入すると、スタックにある一時オブジェクトへの参照が保存されます。これは範囲外になります...

+0

C++の難点は主に例外安全性の問題から生まれたものです。*オブジェクトが解放されずに例外がアップストリームに伝播すると、メモリがリークします。 –

1

参照の使用は基本的にポインタの使用と同じですコード内で逆参照する)。 ベクトルに挿入されたオブジェクトがコピーされずに削除されないように自動的にしたい場合は、boostまたはC++ 11のスマートポインタを使用する必要があります。

vector< smart_ptr<mynode> > nodes; 
for (int i=0; i<10; i++) 
{ 
    smart_ptr<mynode> mn = new mynode(); 
    nodes.push_back(mn); 
} 
+0

ノードが10個のベクトルを作成するには、 'std :: vector nodes(10);' –

+0

@BoPerssonについてはどうでしょうか?しかし、私はOPが提示したのと同じケースで使い方の例を示したかっただけです。 – stanwise

関連する問題