2013-04-26 3 views
1

Я хочу использовать list для хранения последовательности объектов, которые содержат информацию о задачах, которые я буду выполнять. Как только один из этих объектов закончен, я больше не нуждаюсь в нем; Мне просто нужно перейти к следующему объекту в списке. Это в основном очередь.Основные вопросы о std :: list

Что касается указателей на эти объекты:

После того, как я получаю указатель на объект списка, чтобы воздействовать на, если я удалить другие элементы в списке, этот указатель остается в силе, верно? Потому что, как только я закончу свой первый объект, я перейду к следующему, и я буду pop, что первый объект, пока я продолжаю работать со следующим объектом, который теперь становится первым объектом. По сути, я всегда буду работать над первым объектом в списке. Я хочу, чтобы указатели на существующие элементы списка не были аннулированы, даже если я удаляю другие элементы списка.

(Кстати, это основная причина, по которой я хочу использовать list, поэтому я могу манипулировать ею, не требуя, чтобы все другие объекты списка могли быть перемещены в новое пространство в памяти, как в случае с vector, что сделало бы это дорого)

Что касается памяти:

Когда я что-то добавить к списку, можно ожидать, что список, чтобы взять на себя ответственность и, если мой исходный элемент выходит из области видимости, пока список остается в членах области видимости переменной, мой объект все равно сохранится? И затем, как только он выскочит, объект объекта, наконец, выйдет из области видимости?

+3

Если вы собираетесь использовать его в качестве очереди, то почему бы не использовать ['std :: queue'] (http://en.cppreference.com/w/cpp/container/queue)? –

+0

@JoachimPileborg мои данные показывают, что 'list' лучше, если вы будете манипулировать им, итерации через него. – johnbakers

ответ

0

Если я удалю другие элементы в списке, этот указатель останется в силе, верно?

Да, Итераторы для элементов списка остаются в силе, если вы явно не удалите элемент из списка или не очистите список.

Когда я добавляю что-то в список, могу ли я ожидать, что список станет владельцем, и если мой исходный элемент выходит из области видимости, пока список остается в области переменных-членов, мой объект все равно будет сохраняться?

Да, вид.Список копирует элементы, которые вы вставляете в него. На самом деле не принимает, а создает новый объект, которому он владеет.

И после этого, после того, как он выскочит, объект объекта, наконец, выйдет из сферы действия?

Да, объект прекратит свое существование.

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

+0

Если я использую 'iterator' в цикле' for', и я использую 'erase' в текущей итерации' iterator', цикл 'for' должен продолжаться нормально и обращаться к остальным элементам' list'? – johnbakers

+1

@SebbyJohanns Проблема заключается в том, что вы выполняете 'for (iter = ...; iter! = End; ++ iter) list.erase (iter);', стирание аннулирует 'iter' и, следовательно, следующее приращение технически инвалид. Что вы можете сделать, это 'for (iter = ...; iter! = End; iter = list.erase (iter))' или возможно 'for (iter = ...; iter! = End;) if (to_erase) iter = list.erase (iter); else ++ iter; 'в зависимости от ваших конкретных потребностей (частичное стирание и полное стирание, хотя для всего стирания' list.clear() 'было бы намного проще в любом случае). –

+0

@ ChristianRau отлично, сэр, вы ученый * и * джентльмен, я ценю это! – johnbakers

2

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

Да потому, что указатель на std::list не указатель на головной элемент простого двойного связанный списка - std::list класса имеет внутренние указатели и удерживает их от пользователя (вы можете перебирать список, используя итераторы, но не используя простые указатели).

Когда я добавляю что-то в список, могу ли я ожидать, что список станет владельцем, и если мой исходный элемент выходит из области видимости, пока список остается в области переменных-членов, мой объект все равно будет сохраняться? И затем, как только он выскочит, объект объекта, наконец, выйдет из области видимости?

Вам необходимо создать std::list<T>, а не std::list<T*>. Таким образом, когда вы добавляете элемент в список, будет вызываться copy-constructor, и копия объекта будет помещена в список, а не фактический объект.

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