Итератор на vector

Тема в разделе "LANGS.C", создана пользователем KingT, 15 дек 2008.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Почему при добавлении push_back() в vector предыдущий инициализированный итератор не указывает на тот же самый элемент? Разве vector не растет в сторону больших адресов?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Кодес пожалуйста.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Код (Text):
    1. #include <iostream>
    2. #include <vector>
    3.  
    4. int main()
    5. {
    6.     std::vector<int> v(99);
    7.     v.push_back(0);
    8.     for (int i=0; i<100; i++)
    9.     {
    10.         v[i] = i;
    11.     }
    12.     std::vector<int>::iterator iter = v.begin()+99;
    13.     std::cout<<*iter<<std::endl;
    14.     v.push_back(100);
    15.     std::cout<<*iter<<std::endl;
    16. }
    Проверь, у меня указывает. ^)
    А вообще нет гарантии, что при вставке или удалении итератор останется валидным.
    В данном случае он остаётся валидным только потому, что если памяти при вставке элемента в контейнере не достаточно, то её резервируется в два раза больше чем было до этого. Не забывай, в векторе элементы всегда расположены последовательно, и если памяти для новых становиться недостаточно, то необходимо всё скопировать в другую область. Стоит убрать v.push_back(0); и всё.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    [edit]

    Прошу прощения, бустера не дочитал) После пушбека все итераторы надо выкинуть.
     
  5. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    KingT

     
  6. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Код (Text):
    1. vector <int> vect;
    2. std::vector<int>::iterator it;
    3. int result;
    4. int main()
    5. {
    6.    
    7.     vect.push_back(1);
    8.     vect.push_back(2);
    9.     vect.push_back(3);
    10.     vect.push_back(4);
    11.     vect.push_back(5);
    12.  
    13.     it = vect.begin();
    14.     it = it + 3;
    15.     result = *it;
    16.  
    17.     vect.push_back(6);
    18.     vect.push_back(7);
    19.     vect.push_back(8);
    20.     vect.push_back(9);
    21.  
    22.     result = *it;
    23.    
    24.     return 0;
    25. }
    При добавлении vect.push_back(9) итератор начинает указывать на ересь.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    KingT
    Читать умеешь? При вставке девятого элемента происходит реалок.
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Вызывай reserve() перед началом заполнения вектора и не будет ре-аллокаций. Естественно, только до того как будет достигнут предел резервированного пространства.
     
  9. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    KingT, тебе ж booster отписал - нельзя держать итератор после push_back():

    http://www.cplusplus.com/reference/stl/vector/push_back.html

    Если тебе надо запомнить место, то делай так:

    Код (Text):
    1. uint32 offset = std::distance(v.begin(), i);
    2. v.push_back(...);
    3. i = v.begin() + offset;