О C ++ STL метод класса списка erase () - PullRequest
0 голосов
/ 07 февраля 2011

Документация list::erase() гласит "вызов деструктора раньше", что это значит?Если я захочу erase(it) предмет, а затем push_back(*it) предмет снова, будет ли это незаконным, поскольку он уже был уничтожен?

Ответы [ 4 ]

5 голосов
/ 07 февраля 2011

Да, это приведет к неопределенному поведению.Как только вы erase итератор списка, вы аннулируете итератор, что означает, что объект, на который он ссылается, больше не гарантируется как действительный.Это означает, что если вы затем попытаетесь использовать итератор в любом контексте, в том числе попытаться разыменовать значение, чтобы снова добавить его в список, это приведет к неопределенному поведению, которое может вызвать сбой программы, перезаписать важную память или ничего не делать.

Если вы хотите переместить элемент списка назад, рассмотрите возможность использования метода splice списка:

myList.splice(myList.end(), myList, it);

Это перемещает элемент в конец без копирования.

2 голосов
/ 07 февраля 2011

Элемент в контейнере уничтожается при удалении из контейнера. Если вы хотите сохранить объект после удаления его из контейнера, вам нужно сделать его копию и использовать вместо него.

Ваш предложенный код:

v.erase(it);
v.push_back(*it);

недействительно, потому что it становится недействительным после удаления. Вы не можете использовать итератор после того, как он был признан недействительным.

0 голосов
/ 08 февраля 2011

Элемент стирается путем его уничтожения и последующего удаления ссылки на него из списка.Если вы хотите сохранить элемент, вам нужно сделать его копию, прежде чем вызывать команду erase.Все это говорит о том, что, возможно, std :: list не подходит для ваших нужд.

0 голосов
/ 07 февраля 2011

Сочетание стирания и итераторов может быть очень сложным делом. Срок действия различных итераторов после удаления может варьироваться от контейнера к контейнеру. Если вы хотите сделать erase и push_back, вам нужно сначала сохранить копию того, что находится в *it, а затем использовать ее при выполнении push_back.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...