2012-12-01 114 views
1

我的測試程序的目標是在像下面這樣的字符串簡單向量中擦除單元格。 程序失敗(分段故障)。std ::刪除不起作用

static void display(std::vector<std::string> const &vec) 
{ 
    std::vector<std::string>::const_iterator It = vec.begin(); 
    for (; It != vec.end(); ++It) 
     std::cout << *It << " "; 
    std::cout << std::endl; 
} 


int   main(void) 
{ 
    std::vector<std::string> vec; 
    size_t index = 0; 

    vec.push_back("Toto"); 
    vec.push_back("Titi"); 
    vec.push_back("Tata"); 
    vec.push_back("Tutu"); 

    display(vec); 

    std::vector<std::string>::iterator It = vec.begin(); 

    for (size_t idx = 0; It != vec.end(); ++It, idx++) 
     if (!(*It).compare("Tutu")) 
      index = idx; 

    vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end()); //Segmentation fault 

    display(vec); 

    getchar(); 
    return (0); 
} 

有人能幫助我嗎?在此先感謝您的幫助。

+0

難道你需要傳遞一個字符串'remove'? – chris

+1

更仔細地閱讀關於「刪除」的參數。它不需要索引。 –

回答

5
vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end()); 

您需要通過實際的元素(在這種情況下std::string類型)你erase功能。

所以不是index,它應該是somestring

+0

非常感謝您的回答 – user1364743

0
  • 你不得混用迭代器和自制指數。僅使用迭代器。
  • 像複製一樣的算法 - 當您想從實際容器類型中分離出來並且存在執行優化作業的成員函數時,會使用外部算法。在你的情況下,vec擦除對你來說永遠不會發生,只需通過找到的迭代器即可。

0

既然你檢查平等,只需使用std::remove

vec.erase(std::remove(vec.begin(), vec.end(), "Tutu"), 
      vec.end()); 

這是標準的成語。如果由於某種原因,你必須寫 環路自己:

std::vector<std::string>::const_iterator current = vec.begin(); 
while (current != vec.end()) { 
    if (*current == "Tutu") { 
     current = vec.erase(current) ; 
    } else { 
     ++ current; 
    } 
} 

(同樣,標準的成語。)