На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> stl::vector , как работает?
    Вопрос таков:

    В процессе работы я заполнил вектор всякой своей чепухой - как всегда.
    Потом в каком либо месте мне понадобилось запомнить итератор, чтоб относительно него скакать впоследствии.
    После этого я проделал уйму действий с вектором и что же я получу тогда?
    Как узнать, не показывает ли итератор за пределы массива?
    На какой элемент он будет указывать?
    Могу ли я вообще такое делать или оно смысла не имеет?

    Плохо я что то понимаю stl.
      Ты просто запоминаешь идекс элемента, который тебе нужен (как при работе с обыкновенным массивом).
      А по поводу за выход за пределы, у vector есть метод vector.size(), который вернет тебе размер твоего вектора. И соответственно, если индекс больше размера, то что-то ты сделал неправельно :D
        Это конечно похоже, но по моему неверно. Сколь я понимаю, итератор vector'а является указателем на область памяти, содержащую интересующие меня данные. А эта область памяти может быть в процессе работы удалена, изменена и т.д., а сам итератор никак не является индексом массива.
        И сравнивать его с Size неверно.
          Я понимаю, что имеешь в виду. Но просто принято с вектором работать через свободный доступ (тобиш vector[index]).
          А по поводу итератов при любых изменениях сотояния контейнера не гарантируеться правельность созданных до изменения контейнера итераторов. Так что по поводу памяти ты прав.
            Цитата
            dimedrol, 17.01.04, 18:29
            А по поводу итератов при любых изменениях сотояния контейнера не гарантируеться правельность созданных до изменения контейнера итераторов. Так что по поводу памяти ты прав.

            Если мне не изменят память - не гарантируется только для vector'а.

            ADA, либо сохраняй индекс, либо используй deque.
              Цитата Flex_Ferrum @ 18.01.04, 13:13
              Если мне не изменят память - не гарантируется только для vector'а.

              Если мне не изменяет память не гарантируется ни для кого. И лично у меня чаще всего вплывало при работе со списками.
                Читаем стандарт.
                Пункт 23.2.1.3 говорит о том, что любые модификации деки делают ее итераторы невалидными.
                Пункт 23.2.2.3 о том, что добавление элементов в список оставляет все итераторы валидными, а удаление - делает невалидными итераторы удаляемых элементов.
                Пункт 23.2.4.3 - добавление элементов в вектор делает итераторы невалидными только в том случае, если производится переаллокация. Удаление делает невалидными итераторы, указывающие на элементы, находящиеся после точки удаления.
                Пункт 23.1.2 (подпункт 8) - добавление в любой ассоциативный контейнер оставляет все итераторы валидными, удаление делает невалидным только итераторы удаляемого элемента.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0221 ]   [ 16 queries used ]   [ Generated: 27.04.24, 08:58 GMT ]