a.erase(b.begin());
Это вызывает неопределенное поведение, потому что вы передаете итератор, полученный из одного контейнера, в функцию другого контейнера.a
и b
- это два разных контейнера, они не одинаковы.
Неопределенное поведение означает, что все может произойти: оно может работать как положено, а может и нет.Ни спецификация языка, ни компилятор не дают гарантии, что он будет работать.Это точно сказано "неопределенное поведение".
Что вы должны сделать, это:
auto value = *(b.begin()); //value is int
auto it = std::find(a.begin(), a.end(), value); //returns iterator
if ( it != a.end())
a.erase(it); //well-defined, as the iterator belongs to the same container!
Или, если вы хотите удалить все элементы, равные value
, тогда вы можете простосделайте это:
a.remove(value); //std::list has remove member function
Однако, если вы используете std::vector
, который вы должны использовать в большинстве случаев.Это тип контейнера по умолчанию в C ++, и вы должны использовать std::list
только в том случае, если у вас есть для этого веская причина:
std::vector<int> a ={1,2};
std::vector<int> b ={3,4};
//if you want to remove one element:
auto value = *(b.begin()); //value is int
auto it = std::find(a.begin(), a.end(), value); //returns iterator
if ( it != a.end())
a.erase(it); //well-defined, as the iterator belongs to the same container!
И если вы хотите удалить все элементы, равные value
, тогдаВы можете применить популярную Erase-Remove Idiom как:
a.erase(std::remove(a.begin(), a.end(), value), a.end());
Обратите внимание, что std::vector
не имеет remove()
функции-члена, поэтому вы применяете эту идиому.Вы можете прочитать мой ответ здесь , который обсуждает это более подробно.