2016-06-18 11 views
0

タイトルが述べるように、ベクトルを反復しながら、ある場合にはstd::vectorに要素を追加します。次のコードでは、「デバッグアサーションに失敗しました」というエラーが表示されます。私がしたいことを達成することは可能でしょうか?ベクトルを反復しながらベクトルに要素を追加する

これは私がテストしたコードです:

#include <vector> 

class MyClass 
{ 
public: 
    MyClass(char t_name) 
    { 
     name = t_name; 
    } 
    ~MyClass() 
    { 
    } 
    char name; 
}; 

int main() 
{ 
    std::vector<MyClass> myVector; 
    myVector.push_back(MyClass('1')); 
    myVector.push_back(MyClass('2')); 
    myVector.push_back(MyClass('3')); 

    for each (MyClass t_class in myVector) 
    { 
     if (t_class.name == '2') 
      myVector.push_back(MyClass('4')); 
    } 
    return 0; 
} 

EDIT:

for each, in

まあ、私はfor eachは、標準C++だったが、それは、Visual Studioの機能だと思われると思いました

Visual c++ "for each" portability

+0

'各(myVectorでMyClassののT_CLASS)のための'これはC++ですか? – user463035818

+0

これは有効なC++コードではありません! –

+0

iffyの構文は気にする必要はありません。反復処理中に要素をベクトルに挿入するのは意味がありません。なぜなら、 'push_back'は既存のすべてのイテレータを無効にする可能性があるからです。 – pyon

答えて

5

イテレータを既存のstd::vector無効化から項目を追加または削除する行為。だから、例えば、あなたが代わりにインデックスを使用してループする必要がありますなどfor each, inrange-based forstd::for_each()、として、イテレータに依存しているループのいずれかの種類を使用することはできません。

int main() 
{ 
    std::vector<MyClass> myVector; 

    myVector.push_back('1'); 
    myVector.push_back('2'); 
    myVector.push_back('3'); 

    std::vector<MyClass>::size_type size = myVector.size(); 
    for (std::vector<MyClass>::size_type i = 0; i < size; ++i) 
    { 
     if (myVector[i].name == '2') 
     { 
      myVector.push_back('4'); 
      ++size; // <-- remove this if you want to stop when you reach the new items 
     } 
    } 

    return 0; 
} 
0

pyonによって指摘されているように、イテレータが要素を挿入することによってイテレータが無効になるため、要素をイテレータで反復処理しながらベクトルに挿入することはできません。しかし、ベクトルの後ろにある要素だけを押したいと思うようです。これは、イテレータを使用せずに行うことができますが、停止条件には注意する必要があります:

std::vector<MyClass> myVector; 
size_t old_size = myVector.size(); 
for (int i=0;i<old_size;i++) { 
    if (myVector[i].name == '2') { myVector.push_back(MyClass('4')); } 
} 
関連する問題