Постоянная ссылка std :: vector - PullRequest
1 голос
/ 15 июля 2011

Как получить ссылку на определенный элемент в std :: vector?

Самый простой способ - сохранить его как индекс элемента (я использую переменную size_t).

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

Ответы [ 3 ]

4 голосов
/ 15 июля 2011

Не очень хороший способ отслеживать отдельный элемент внутри vector по указателю, ссылке или индексу.В частности:

  1. Если вы вставите новый элемент в vector, это может привести к тому, что все невыполненные ссылки на элементы vector станут недействительными, если произойдет внутреннее перераспределение.Вставки могут произойти либо путем вызова insert, reserve, push_back или assign (плюс, возможно, несколько других).Это может привести к тому, что ссылка будет ссылаться на недопустимый объект, что приведет к неопределенному поведению при использовании ссылки.

  2. Если вы удалите элемент из vector, то ссылка может недлинная точка на том же элементе.Доступ к ссылке может привести к тому, что вы ссылаетесь на неправильный объект.

Если вам действительно нужно хранить ссылку на элемент в vector, один из вариантов будет иметь vector хранить (умные) указатели на объекты вместо самих объектов.Таким образом, вы можете хранить копию этого указателя в другом месте, и независимо от того, что происходит в vector, указатель все равно должен быть действительным.Это на самом деле фундаментальная теорема разработки программного обеспечения на практике - добавление еще одного уровня косвенности может решить большинство проблем.

1 голос
/ 15 июля 2011

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

В противном случае вы не сможете поддерживать ссылку, потому что, как вы упоминали, вектор может перемещать элементы вокруг.

0 голосов
/ 16 июля 2011

Используйте вектор, который содержит авто указатели, например std::vector<std::unique_ptr<YOUR_ELEMENT_TYPE>>, если вы используете c ++ 0x.

...