2017-09-18 5 views
-1

ベクトルを参照で取り込む関数を作成しようとしていますが、ベクトルのエントリ2を見ると、そのエントリを削除して5の4つのコピーに置き換えようとします。vector.insertはベクトルのサイズを変更しませんか?

ベクトルが222(それはサイズn = 3)、私は新しいベクトルとして555555555555を望む

しかし、インデックスが< nである場合、最初のいくつかの場合にのみ正しく動作します。

今のところ、ベクトルaを555522に変更する ベクトルのサイズを変更する方法はありますか?

void replace2 (vector <int>* a, int n){ 

    for (int i = 0; i < n; ++i){ 
    if ((*a)[i] == 2){ 
     (*a).erase((*a).begin() + i); 
     for(int j = 0; j < 4; ++j){ 
     (*a).insert((*a).begin() + i, 5); 
      } 
     } 
     } 

} 
+4

[トピックを削除]ポインタの代わりにベクトルへの参照を使用してください。 – Charles

+3

ループの最初の反復後、 '(* a)[i]'はもはや2に等しくなりません。残りの反復は何も行いません。 –

+0

@Charles私が関数を呼び出すとき、私はreplace2(&a、3)を実行します – shoestringfries

答えて

5

for (int i = 0; i < n; ++i) { ... } 

を使用しての問題は、すでにコメントの一つで指摘されていない:

ループの最初の反復の後、(*a)[i]は、もはや残りの2に等しいです。反復は何もしません。

ベクトルの最後から繰り返して元に戻すと、関数が単純化されます。

また、ポインタではなくベクトルへの参照を渡します。

#include <vector> 
#include <iostream> 

void replace2(std::vector <int>& a, int n){ 
    for (int i = n-1; i >= 0; --i){ 
     if (a[i] == 2){ 
     a.erase(a.begin() + i); 
     for(int j = 0; j < 4; ++j){ 
      a.insert(a.begin() + i, 5); 
     } 
     } 
    } 
} 

int main() 
{ 
    std::vector<int> a{2, 2, 2}; 
    replace2(a, 3); 

    for(auto item : a) 
    { 
     std::cout << item; 
    } 

    std::cout << std::endl; 
} 

はそれがhttps://ideone.com/0Lip5jで働く参照:

はここで完全なプログラムです。

関連する問題