2016-08-09 1 views
0

何か配線されていますかstdベクトル 変数は値が動的に変更されますが、その例では20未満です。 dynamicSizeToInsert なぜベクトルサイズが拡大し続けるのですか?std vector size keep ground同じインデックスに挿入しますが

std::vector<int> v; 
//sometimes its 5 sometimes it is 10 sometimes it is N < 20 
int dynamicSizeToInsert = 5 
int c = 0; 
for(std::vector<int>::size_type i = 0; i != 100; i++) { 
    if(c == dynamicSizeToInsert) 
    { 
     c = 0; 
    } 
    v.insert(v.begin() + c, c); 
    c++; 

    printf("%d",v.size()) //THIS THINK KEEP growing although i only using vector indexes 0 to 4 allways 
} 

私は私のベクトル側 大きいと新しい値が同じインデックスに他の値上で実行されますその5つの要素を維持したいです。

+2

は、どのようなベクトルの説明を読み直し::挿入はありません。 – 1201ProgramAlarm

+0

oそれは成長し続けるだけです。ありがとう、最良の選択肢は何ですか? – user63898

+0

@ user63898既存のエントリを上書きしたい場合は、神の古いアクセス 'operator []'、つまり 'v [i]'を使います。 –

答えて

1

std::vector::insert名前が示すように、は、指定された位置に要素を挿入します。

c == dynamicSizeToInsertの場合、c0に設定されます。だから今、v.size() == 5。今、この行が実行されます。

v.insert(v.begin() + c, c); 

この位置0ある、posistion v.begin() + 00を挿入しますと、それは(それが位置0にある要素を置き換えることはありませます)他のすべての要素を相殺し、そのベクトルを保持します成長する。代わりにinsertを使用しての


operator[]を使用します。

//So that 'v' is the right size 
v.resize(dynamicSizeToInsert); 

for(std::vector<int>::size_type i = 0; i != 100; i++) { 
    if(c == dynamicSizeToInsert) 
    { 
     c = 0; 
    } 

    v[i] = c; //Sets current index to 'c' 
    c++; 
} 
+0

最初のサイズ変更は非常に重要です! – user63898

+0

@ user63898ええ、またはあなたは割り当てられていないメモリにアクセスしようとします:) – Rakete1111

1

のstd ::ベクトル::挿入が指定されたインデックスの配列に新しいメンバーを挿入し、それが容量に達すると、アレイを再割り当て前方、あるいは他の要素を移動する(比較的高価な操作)

の要素の前に新しい要素を挿入してベクトルを拡張し、コンテナのサイズを 要素の数だけ増加させます。

これは、新しいベクトルサイズが現在のベクトル 容量を超えている場合にのみ、割り当てられた記憶領域 が自動的に再割り当てされるようにします。 (http://www.cplusplus.com/reference/vector/vector/insert/

上記のように、ベクターは挿入操作ごとに拡張されます。 は、あなたが望む動作を取得するために、あなたはそうのように[]演算子を使用する必要があります。

v[i] = some_new_value; 

新しい要素が追加されることはありませんこのよう、変更されたi番目の要素のその値のみ。

1

insertは、要素を置き換えるのではなく、指定された場所に要素を挿入し、すべての右要素を右に1つシフトします。だからあなたのベクトルサイズが成長している理由です。

既存のインデックスを置き換える場合は、operator[]を使用できます。ただし、operator[]を使用するには、インデックスを0 - size() - 1にする必要があります。

0
const int dynamicSizeToInsert = 5; 
std::vector<int> v(dynamicSizeToInsert); 
int c = 0; 
for(std::vector<int>::size_type i = 0; i !=100; i++) 
{ 
    v.at(i%dynamicSizeToInsert) = (dynamicSizeToInsert == c?c = 0,C++: C++); 

    printf("%d",v.size()); 
} 
+1

コードのみの回答はお勧めできません、いくつかの説明を含めることをお勧めします。 – SurvivalMachine

+0

あなたのアドバイスをありがとう –

関連する問題