2012-12-08 37 views
0

最終,如果我試圖刪除與某個鍵相關聯的向量的所有元素,則會遇到分段錯誤。我的預期輸出是新的b新的c新的d新的a,但是我得到新的b新的c新的d分段錯誤。如果與multimap關聯的向量爲空,則刪除該鍵

#include <iostream> 
#include <vector> 
#include <map> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    map<char,vector<char> > mmap; //multimap 
    char mychar[] = { 'b','c', 'd'}; 
    vector<char> vec (mychar,mychar+3); 
    vector<char> newvec; 

    mmap.insert (pair<char,vector<char> >('a',vec)); //insert to multimap 
    mmap.insert (pair<char,vector<char> >('b',vector<char>())); 
    mmap.insert (pair<char,vector<char> >('c',vector<char>())); 
    mmap.insert (pair<char,vector<char> >('d',vector<char>())); 

    vector<char>::iterator veciter; 
    map<char,vector<char> >::iterator mapiter; 

    for(int i=0;i<6;i++) 
    { 
    for (mapiter = mmap.begin(); mapiter != mmap.end(); ++mapiter) 
    { 
    //if elements associated with vector of a key are empty the store the key in a new vector 
    if(mapiter->second.empty()) 
    { 
     newvec.push_back (mapiter->first); 
     mmap.erase(mapiter); 
    } 
    else 
    { 
     for (veciter = mapiter->second.begin(); veciter != mapiter->second.end(); ++veciter) 
     { 
     //if an element of a vector of key is found in new vector, erase the element 
     if (find(newvec.begin(), newvec.end(), *veciter)!=newvec.end()) 
     { 
      mapiter->second.erase(veciter); 
     } 

     } 
    } 
    // to display values of new vector  
    for (unsigned i=0; i<newvec.size(); ++i) 
    cout << "new " << newvec[i]<<' '; 
    cout << '\n'; 
    } 
    } 

    return 0; 
} 

回答

3

當您將迭代器傳遞給容器的擦除函數時,該迭代器將失效。你需要說明這一點。假設,由於某種原因,既不std::remove也不std::remove_if會爲你的情況下工作,標準的成語是這樣的:

for (it = container.begin(); it != container.end(); /* no increment here */) 
{ 
    if (should_be_removed(*it)) 
    { 
     // possibly other operations involving the element we are about to remove 
     it = container.erase(it); 
    } 
    else 
    { 
     // possibly other operations involving the element we chose not to remove 
     ++it; 
    } 
} 

當我們刪除的元素,我們捕獲的擦除操作的返回值,這是下一個迭代器。否則,我們增加。請注意我留下空間進行其他可能操作的空間。如果沒有其他操作,您應該只能使用std::removestd::remove_if,並結合容器的範圍擦除功能(需要兩個迭代器)。

相關問題