Удаление элементов из вектора внутри цикла

#c #vector

#c #вектор #c

Вопрос:

У меня есть вектор, words_in_family , типа: vector<vector<string>> . Я пытаюсь удалить каждый элемент, words_in_family который не равен вектору строк largest_family , но у меня возникают проблемы, и я не уверен, почему. Любая помощь приветствуется.

 for (int i = words_in_family.size() - 1; i >= 0; i--)
{
    if (words_in_family[i] != largest_family)
    {
        words_in_family.erase(words_in_family[i]);
    }
}
  

Комментарии:

1. Какая у вас проблема?

2. ‘вектор<строка, vector<строка>>’ … объявление вектора неверно.. вы должны получить ошибку компиляции. Можете ли вы указать, как вы объявили вектор

3. @SauravSahu У меня ошибка под .erase. , в которой упоминается что-то о перегруженной функции, и код выполняется, но удаление векторных элементов не происходит.

4. @SabyasachiBehera Извините, это была ошибка. Должно быть исправлено сейчас.

5. Я опубликую это в качестве комментария, потому что вы должны быть в состоянии сделать это так, как хотите, поэтому я предполагаю, что в какой-то момент вы получите ответ на этот вопрос, но не эффективнее ли просто создать новый одновекторный элемент и поменять его местами с тем, который у вас есть, или очистить вектор и затем нажать largest_family ?

Ответ №1:

erase метод не принимает значения. Вместо этого используйте итератор в качестве параметра для erase метода:

 vector<vector<string>>::iterator it = words_in_family.begin();
for (int i = words_in_family.size() - 1; i >= 0; i--)
{
    if (words_in_family[i] != largest_family)
    {
        words_in_family.erase(it i);
    }
}
  

удаление итератора (позиция итератора);
удаление итератора (первый итератор, последний итератор);

Обратите внимание, что итераторы для std::vector являются итераторами произвольного доступа, поэтому вы можете добавлять / вычитать целые значения, чтобы получить другие допустимые итераторы.

Ответ №2:

C std::vector сотрите элемент, в вашем случае:

Удалить элемент из вектора ( words_in_family ), значение которого равно largest_family :

 std::vector<std::vector<std::string>>::iterator Itr;
for(Itr = Words_in_family.begin(); Itr != Words_in_family.end();)
{
    if(*Itr == largest_family)
    {
        Itr = Words_in_family.erase(Itr);
    }
    else
    {
        Itr  ;
    }
}
  

Ответ №3:

 words_in_family.erase(words_in_family.begin() i, words_in_family.begin() i 1);
  

erase принимает итератор в качестве аргумента