2012-12-01 2 views
1

Цель моей тестовой программы - удалить ячейку простым вектором строк, как показано ниже. Ошибка программы (ошибка сегментации).std :: remove не работает

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 erase делает для вас бесконечным, просто пройдите найденный итератор

    vec.erase (It);

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; 
    } 
} 

(Опять же, стандартный идиома.)

Смежные вопросы