Форум программистов, компьютерный форум CyberForum.ru

Итераторы - C++

Восстановить пароль Регистрация
 
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
26.11.2013, 18:09     Итераторы #1
Всем добрый вечер! Есть небольшие затруднения , вот например фрагмент кода:
C++
1
2
3
4
5
6
7
8
9
10
//...
    multimap<int,Point> divisionP;
    multimap<int,Point>::const_ iterator i;
    Point temp;
    for (i=divisionP.begin();i!=divisionP.end();i++){
        temp=i->second;
        cout<<"Для контура "<<i->first<<" существует точка: "; temp.show(); 
        cout<<endl;
    }
//...
Не могли бы вы подсказать, как мне сделать так, чтобы значение итератора i указывало не на начало multimap, а например на 2, от начала контейнера, значение? Единственное, что пришло на ум инкрементировать дважды итератор, перед циклом, думаю , что это не очень хорошее решение...
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2013, 18:09     Итераторы
Посмотрите здесь:

Итераторы и обратные итераторы C++
Итераторы в C++ C++
Итераторы С++ C++
Итераторы C++
C++ Итераторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FAQEnD
 Аватар для FAQEnD
43 / 43 / 1
Регистрация: 15.12.2012
Сообщений: 88
26.11.2013, 18:17     Итераторы #2
C++
1
for (i=divisionP.begin()+1;i!=divisionP.end();i++)
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
26.11.2013, 18:28  [ТС]     Итераторы #3
FAQEnD, Во первых это не компилируется. Если можете сказать почему не компилируется ответьте. Я думал это связано с тем, что с.begin() возвращает двунаправленный итератор, а вами приведенная операция iter+n, возможна вроде только для итераторов произвольного доступа?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
26.11.2013, 18:32     Итераторы #4
Артем Смирнов, если знаешь значение i-го элемента, то через find. Если нет, то да, инкрементацией.

http://www.cplusplus.com/reference/m...p/?kw=multimap

map - это то ли АВЛ, то ли красно-черное дерево, а в нем нет индексов, чтобы можно было так просто к i-ому элементу обратиться. Только через указатель, find (O(log(n))) или последовательная инкрементация итератора.
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
26.11.2013, 18:47  [ТС]     Итераторы #5
Спасибо большое за разъяснения!
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
26.11.2013, 18:54     Итераторы #6
или, возможно, map реализован при помощи ассоциативных массивов. Что всё-равно намекает на то, что прямой индексации нет
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.11.2013, 19:28     Итераторы #7
C++
1
i=divisionP.begin()+2
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
26.11.2013, 19:31     Итераторы #8
castaway, а у них разве бинарный + перегружен?
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
26.11.2013, 19:33  [ТС]     Итераторы #9
castaway, Всегда, сколько не пытался
C++
1
|44|error: no match for 'operator+' in 'divisionP.std::multimap<_Key, _Tp, _Compare, _Alloc>::begin [with _Key = Point, _Tp = int, _Compare = classcomp, _Alloc = std::allocator<std::pair<const Point, int> >]() + 2'|
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.11.2013, 20:06     Итераторы #10
У меня нет под рукой компьютера (я с телефона). Вы в каком стандарте пробуете компилировать?
Артем Смирнов
6 / 6 / 1
Регистрация: 15.05.2012
Сообщений: 40
26.11.2013, 20:19  [ТС]     Итераторы #11
castaway, а что в C++11 все работает?, у меня компилятор GCC 4.8.0 , там вроде нет поддержки стандарта C++11
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
26.11.2013, 20:20     Итераторы #12
castaway, в 99 точно нет. Сколько раз пробовал. А вот 11 и 14 не пробовал ни разу.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
26.11.2013, 20:26     Итераторы #13
В GCC 4.7.2 есть поддержка C++11
nexen, ты вообще в C++ компилируешь? Что такое 99 ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2013, 20:40     Итераторы
Еще ссылки по теме:

итераторы C++
C++ Итераторы С++
C++ Итераторы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
26.11.2013, 20:40     Итераторы #14
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
i=divisionP.begin()+2
Это не дожно работать, там же итераторы не с произвольным доступом.
C++
1
i = std::next(divisionP.begin(), 2);
либо
C++
1
2
i = divisionP.begin();
std::advance(i, 2);
Добавлено через 56 секунд
Цитата Сообщение от Артем Смирнов Посмотреть сообщение
у меня компилятор GCC 4.8.0 , там вроде нет поддержки стандарта C++11
-std=c++11, по умолчанию там c++03
Yandex
Объявления
26.11.2013, 20:40     Итераторы
Ответ Создать тему
Опции темы

Текущее время: 22:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru