Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.151.106] |
|
Сообщ.
#1
,
|
|
|
Вопрос таков:
В процессе работы я заполнил вектор всякой своей чепухой - как всегда. Потом в каком либо месте мне понадобилось запомнить итератор, чтоб относительно него скакать впоследствии. После этого я проделал уйму действий с вектором и что же я получу тогда? Как узнать, не показывает ли итератор за пределы массива? На какой элемент он будет указывать? Могу ли я вообще такое делать или оно смысла не имеет? Плохо я что то понимаю stl. |
Сообщ.
#2
,
|
|
|
Ты просто запоминаешь идекс элемента, который тебе нужен (как при работе с обыкновенным массивом).
А по поводу за выход за пределы, у vector есть метод vector.size(), который вернет тебе размер твоего вектора. И соответственно, если индекс больше размера, то что-то ты сделал неправельно |
Сообщ.
#3
,
|
|
|
Это конечно похоже, но по моему неверно. Сколь я понимаю, итератор vector'а является указателем на область памяти, содержащую интересующие меня данные. А эта область памяти может быть в процессе работы удалена, изменена и т.д., а сам итератор никак не является индексом массива.
И сравнивать его с Size неверно. |
Сообщ.
#4
,
|
|
|
Я понимаю, что имеешь в виду. Но просто принято с вектором работать через свободный доступ (тобиш vector[index]).
А по поводу итератов при любых изменениях сотояния контейнера не гарантируеться правельность созданных до изменения контейнера итераторов. Так что по поводу памяти ты прав. |
Сообщ.
#5
,
|
|
|
Цитата dimedrol, 17.01.04, 18:29 А по поводу итератов при любых изменениях сотояния контейнера не гарантируеться правельность созданных до изменения контейнера итераторов. Так что по поводу памяти ты прав. Если мне не изменят память - не гарантируется только для vector'а. ADA, либо сохраняй индекс, либо используй deque. |
Сообщ.
#6
,
|
|
|
Цитата Flex_Ferrum @ 18.01.04, 13:13 Если мне не изменят память - не гарантируется только для vector'а. Если мне не изменяет память не гарантируется ни для кого. И лично у меня чаще всего вплывало при работе со списками. |
Сообщ.
#7
,
|
|
|
Читаем стандарт.
Пункт 23.2.1.3 говорит о том, что любые модификации деки делают ее итераторы невалидными. Пункт 23.2.2.3 о том, что добавление элементов в список оставляет все итераторы валидными, а удаление - делает невалидными итераторы удаляемых элементов. Пункт 23.2.4.3 - добавление элементов в вектор делает итераторы невалидными только в том случае, если производится переаллокация. Удаление делает невалидными итераторы, указывающие на элементы, находящиеся после точки удаления. Пункт 23.1.2 (подпункт 8) - добавление в любой ассоциативный контейнер оставляет все итераторы валидными, удаление делает невалидным только итераторы удаляемого элемента. |