Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.71
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
#1

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

16.08.2011, 16:27. Просмотров 6698. Ответов 40
Метки нет (Все метки)

Как выглядит итератор на вложеный контейнер? Например осуществить доступ к 1-му символу 3-го элемента в векторе vector< <vecrot<char> > vec через индекс можно так vec[2][0]. А как через итератор?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2011, 16:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Итератор ? (C++):

Реализовать двусвязный список (list), итератор (iterator) и константный итератор (сonst_iterator) для списка - C++
не могу понять что должно быть результатом. может подскажете примеры? пожалуйста. Задание: Реализовать двусвязный список (list),...

итератор - C++
скажите как в этой задачи перевести десятичное число в двоичное??? вот условие задачи!!! вот код!! main.h #include &lt;cstdlib&gt; ...

Итератор - C++
Вот задача: Реализовать шаблон упорядоченного массива как двусвязного списка. Операцию доступа по индексу заменить итератором. Вопрос:...

Итератор - C++
#include &lt;iostream&gt; #include &lt;list&gt; using namespace std; list&lt;int&gt;::iterator pos (list&lt;int&gt; a,list&lt;int&gt;::iterator it) { for (it;...

Итератор!!!!! - C++
Есть такое задание: Разработать класс «Итератор», который должен содержать конструктор и функции просмотра текущего элемента, перехода к...

Итератор С++ - C++
помогите пожалуйста написать итератор, накапливающий сумму пройденных элементов!!!

40
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.08.2011, 18:26 #16
Цитата Сообщение от Сыроежка Посмотреть сообщение
На самом деле итератор - это шаблонный класс, моделирующий указатели.
Скажи это итераторам по мэпу.)

Добавлено через 1 минуту
Цитата Сообщение от fasked Посмотреть сообщение
И кстати, я думаю, тут более уместно было бы сказать, что итератор предназначен для последовательного (итеративного) применения
Под последовательным доступом я именно это и имел в виду. Нужно мне яснее изъсняться.)

Добавлено через 59 секунд
v.begin()
v.begin()+1
v.begin()+2
Тоже последовательный доступ при помощи итераторов
0
Сыроежка
Заблокирован
16.08.2011, 18:27 #17
Цитата Сообщение от Deviaphan Посмотреть сообщение
Скажи это итераторам по мэпу.)

Добавлено через 1 минуту

Под последовательным доступом я именно это и имел в виду. Нужно мне яснее изъсняться.)

Добавлено через 59 секунд
v.begin()
v.begin()+1
v.begin()+2
Тоже последовательный доступ при помощи итераторов
Я вам еще раз повторяю: не фантазируйте, а читайте стандарт!

И это не последовательный доступ, а произвольный доступ. Так как у итераторов последовательного доступа не операции сложения с целочисленным значением!

У вас каша в голове! И полное незнание главы стандарта Итераторы.
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
16.08.2011, 22:14 #18
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от OstapBender Посмотреть сообщение
обращение к 4 элементу 3-го вектора примерно так:
*((vec.begin()+3)->begin()+4 ) = 10;
Так как выражение p[n] есть сокращенная запись выражения *(p + n), то выражение
C++
1
*( (matr.begin() + 3)->begin() + 4 )
равносильно выражению
C++
1
matr.begin()[3].begin()[4]
3
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
17.08.2011, 01:36 #19
Mr.X, интересное замечание. но это всё таки читерство, т.к юзается [] .
а вообще
C++
1
matr.begin()[3].begin()[4]
также можно заменить на
C++
1
matr.at(3).at(4)
а это уже почти [][]
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.08.2011, 02:04 #20
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я вам еще раз повторяю: не фантазируйте, а читайте стандарт!
итераторы как понятие существуют в программировании и вне стандарта, собственно вне стандарта они и появились
как бы там ни было основная идея итератора - обход контейнера без раскрытия особенностей его реализации, не важно ++ это, java или c# или еще бог весть что
0
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
17.08.2011, 07:28 #21
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Сыроежка Посмотреть сообщение
На самом деле итератор - это шаблонный класс, моделирующий указатели. А для указателей, как известно, действует арифметика указателей, то есть произвольный доступ.
И итераторы именно появились из-за того, что появилась необходимость моделировать указатели для последовательностей, к которым встроенные указатели не подходят.

То есть главный смысл понятия итераторов - это моделирование указателей. То есть нельзя сказать, что итераторы используются исключительно для последовательного доступа. Иначе сразу же вылетают многие алгоритмы, начиная с простого алгоритма swap.
Не... Форма указателей - это только в С++, чтобы было как у массива. Для массива в языке есть естественный "итератор" - указатель. Поэтому в С++ "подогнали" синтаксис к этому "итератор". А вообще итератор ака Курсор - это один из паттернов. Реализован может быть как угодно. Не обязательно шаблонным классом. Может быть вообще - не класс... Много написал про это Элджер. У него вообще весьма хорошая книга про указатели.
Добавлю:

Доступ к элементам контейнера
Одной из важнейших характеристик является доступ к элементам контейнера. Обычно различают прямой, последовательный и ассоциативный доступ. Прямой доступ к элементу — это доступ по номеру (или, еще говорят, по индексу) элемента. Именно таким образом мы обращаемся к элементам массива, Выражение
v[7]
означает, что мы хотим оперировать элементом контейнера v, имеющим номер (индекс) 7. Нумерация элементов может начинаться, вообще говоря, с любого числа, однако в С++ принято нумерацию начинать с нуля, так как для массивов (которые являются частным случаем контейнера) принята именно такая нумерация.

Последовательный доступ отличается тем, что мы не имеем в распоряжении индексов элементов, зато можем перемешаться последовательно от элемента к элементу. Можно считать, что существует невидимая «стрелка»-индикатор, которую перемещают по элементам контейнера с помощью некоторого множества операций. Тот элемент, на который в данный момент «стрелка» показывает, называется текущим элементом.
Обычно набор операций последовательного доступа включает следующие:
- перейти к первому элементу,
- перейти к последнему элементу,
- перейти к следующему элементу,
- перейти к предыдущему элементу,
- перейти на n элементов вперед (от первого в сторону последнего элемента контейнера),
- перейти на n элементов назад (от конца к началу контейнера),
- получить (изменить) значение текущего элемента.

Эти операции могут быть представлены в функциональной форме, например, так
C++
1
2
3
4
5
6
7
next(v);            // перейти к следующему
prev(v);            // перейти к предыдущему
first(v);           // перейти к первому
last(v);            // перейти к последнему
current(v);         // получить текущий
forward(v, n);      // перейти на n элементов вперед 
back(v, n);         // перейти на n элементов назад
Те же операции, реализованные как методы класса (контейнера), можно представить таким образом:
C++
1
2
3
4
5
6
7
v.next();           // перейти к следующему
v.prev();           // перейти к предыдущему
v.first();          // перейти к первому
v.last();           // перейти к последнему
v.current();                // получить текущий
v.skip(n);          // перейти на n элементов вперед 
v.skip(-n);         // перейти на n элементов назад
Однако в С++ «стрелку»-индикатор удобнее представить в виде некоторого объекта, связанного с контейнером. Если этот объект имеет имя iv, то те же операции могут быть реализованы и так:
C++
1
2
3
4
5
6
7
iv = v.begin(); // перейти к первому
iv = v.last();      // перейти к последнему
++iv;               // перейти к следующему
--iv;               // перейти к предыдущему
iv+=n;          // перейти на n элементов вперед
iv-=n;          // перейти на n элементов назад
*iv             // получить значение текущего элемента
Не правда ли, очень похоже на указатель?! Однако это не указатель — в практике объектно-ориентированного программирования такой объект называется итератором. Итератор — это объект, обеспечивающий (последовательный) доступ к элементам контейнера. Итератор представляет собой более общую концепцию, чем указатель. В книге [17] итератор описан как один из паттернов программирования — Iterator.
6
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
17.08.2011, 08:58 #22
Цитата Сообщение от OstapBender Посмотреть сообщение
Mr.X, интересное замечание. но это всё таки читерство, т.к юзается [] .
а вообще
C++
1
matr.begin()[3].begin()[4]
также можно заменить на
C++
1
matr.at(3).at(4)
а это уже почти [][]
Но в выражении
C++
1
matr.begin()[3].begin()[4]
квадратные скобки - это отнюдь не вызов оператора [] вектора, а работа с операциями
итератора. Сначала выполняется операция итератора +. а затем операция итератора *
(разыменование).
0
Сыроежка
Заблокирован
17.08.2011, 15:40 #23
Цитата Сообщение от alex_x_x Посмотреть сообщение
итераторы как понятие существуют в программировании и вне стандарта, собственно вне стандарта они и появились
как бы там ни было основная идея итератора - обход контейнера без раскрытия особенностей его реализации, не важно ++ это, java или c# или еще бог весть что
Но мы в данной теме говорим не об итераторах вообще, а об конкретном понятии итератора в рамках стандарта С++. Исходный вопрос темы состоит в том, как записать итератор для ветора, то есть построение синтиаксической конструкции в рамках стандарта языка С++.
Интерпретировать итераторы, как исключительно для последовательного обхода - это на самом деле сужение понятия итератора, которое выражено в стандарте С++. В стандарте С++ прямо говорится, что итераторы - это обобщение указателей. А, как известно, указатели обладают арифметикой указателей, то есть арифметикой произвольного доступа. Поэтому, строго говоря, итераторы должны соответствовать возможностям указателей. И исходный пример решения вопроса темы как раз демонстрирует такое поведение итераторв, так как к итератору вектора в представленных примерах непосредственно прибавляется целочисленное выражение. То есть примеры этой темы как раз совершенно не демонстрируют такое узкое понимание, как исключительно последовательный доступ.

То есть я хочу отметить, что не следует пытаться переиначивать смысл стандарт, сужая значения понятий, данных в стандарте.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.08.2011, 15:57 #24
Цитата Сообщение от Сыроежка Посмотреть сообщение
В стандарте С++ прямо говорится, что итераторы - это обобщение указателей. А, как известно, указатели обладают арифметикой указателей, то есть арифметикой произвольного доступа.
++для указателя и ++ для итератора - две большие разницы. Настолько большие, что о слове "указатель" стоит вообще забыть, в разговоре об обобщённых контейнерах.

Добавлено через 21 секунду
*инкремент в смысле, а не ++
0
Сыроежка
Заблокирован
17.08.2011, 16:48 #25
Цитата Сообщение от Deviaphan Посмотреть сообщение
++для указателя и ++ для итератора - две большие разницы. Настолько большие, что о слове "указатель" стоит вообще забыть, в разговоре об обобщённых контейнерах.

Добавлено через 21 секунду
*инкремент в смысле, а не ++
Не вижу большого смысла в вашем утверждении.
Например, для шаблонного класса вектор очень часто итератор реализуется в виде обычного указателя. Поэтому вы никакой разницы не заметите, используется ли разработчиками класса вектор итератор в виде обычного указателя, или в виде отдельного класса. В этом и состоит смысл итераторов, чтобы вы не видели разницу между работой с итераторами в виде классов и с обычными указателями.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.08.2011, 17:16 #26
Цитата Сообщение от Сыроежка Посмотреть сообщение
Например, для шаблонного класса вектор
Где во фразе "Обобщённый контейнер" есть слово "вектор"? Список, набор, словарь также являются контейнерами и поддерживают итератор. Что в них общего с указателями, кроме оператора разыменования?
Даже для вектора итераторы не всегда могут быть простыми указателями, т.к. итераторы обратного обхода (reverse iterator) нельзя просто заменить указателем.
Т.е. взаимозаменяемы исключительно (forward)итератор и указатель. Всё! Но это лишь малое подмножество всех возможных итераторов.

Цитата Сообщение от Сыроежка Посмотреть сообщение
В этом и состоит смысл итераторов, чтобы вы не видели разницу между работой с итераторами в виде классов и с обычными указателями.
Ничего подобного. Работа со словарём через итераторы не имеет ничего общего с работой со словарём через указатели.

Итераторы предназначены для единообразного обхода любых контейнеров, поддерживающих итераторы. Что, потенциально, даёт возможность взаимозаменяемости контейнеров, но в первую очередь служит для снижения сложности.
0
Сыроежка
Заблокирован
17.08.2011, 21:08 #27
Цитата Сообщение от Deviaphan Посмотреть сообщение
Где во фразе "Обобщённый контейнер" есть слово "вектор"? Список, набор, словарь также являются контейнерами и поддерживают итератор. Что в них общего с указателями, кроме оператора разыменования?
Даже для вектора итераторы не всегда могут быть простыми указателями, т.к. итераторы обратного обхода (reverse iterator) нельзя просто заменить указателем.
Т.е. взаимозаменяемы исключительно (forward)итератор и указатель. Всё! Но это лишь малое подмножество всех возможных итераторов.


Ничего подобного. Работа со словарём через итераторы не имеет ничего общего с работой со словарём через указатели.

Итераторы предназначены для единообразного обхода любых контейнеров, поддерживающих итераторы. Что, потенциально, даёт возможность взаимозаменяемости контейнеров, но в первую очередь служит для снижения сложности.
А по вашемму вектор не относится к обобщенным контейнерам?! И где вы в стандарте нашли для вектора какие-то исключения для реализации его итератора?!

Что общего у итераторв с указателями? Да, практически, все! То есть если вы возьмете итератор произвольного доступа, то вы не найдете никаких отличий! В этом и состоит смысл введения итераторов! Естественно, что некоторые контейнеры накладывают ограничения на возможности итераторов. Но это не меняет суть вопроса!

И вы глубоко заблуждаетесь, что для вектора, у которого итератором может служить простой указатель, нельзя делать обратный обход!?! И даже для итератора вектора, который не является обычным указателем, можно делать обратный обход!

ВЫ просто демонстрируете свое полное незнание стандартного класса вектор! Итератор класса вектор является [I]итератором произвольного доступа, как и у обычных массивов[/I] А это значит вы можете применять любую операцию, которая является корректной для указателей. То есать вы можете не только делать операцию инкримента, но и операцию декримента для обратного обхода! Более того, если бы вы внимательно посмотрели эту тему, то увидели, что здесь используются в примерах выражения вида v.begin() + 4, а это означает, что вы также можете и вычитать из итератора вектора, а, значит, и делать обратный обход!
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.08.2011, 23:36 #28
Сыроежка, Скорее вы. Вам одно говорят, вы другое отвечаете. Говорилось, что контейнеров стандартных много, а не только вектор. Итератор не есть указатель. А reverse_iterator не сможет работать с простым указателем. Но вы все переиначили и опять пытаетесь выставить человека дураком. Учите ка С++, а не учите других.
2
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.08.2011, 06:25 #29
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что общего у итераторв с указателями? Да, практически, все!
Только оператор разыменования, инкремент и декремент. Т.е. в тексте выглядит похоже, не спорю, но на этом схожесть заканчивается.
0
Romiys
3 / 3 / 0
Регистрация: 27.12.2010
Сообщений: 56
18.08.2011, 22:37  [ТС] #30
Цитата Сообщение от Сыроежка Посмотреть сообщение
На самом деле итератор - это шаблонный класс, моделирующий указатели. А для указателей, как известно, действует арифметика указателей, то есть произвольный доступ.
И итераторы именно появились из-за того, что появилась необходимость моделировать указатели для последовательностей, к которым встроенные указатели не подходят.

Как я уже сказал, в самом начале главы "Итераторы" стандарта, дается развернутое пояснение, что такое итераторы, и для чего они созданы. Там не говорится ни о каком "исключительно последовательном доступе". Поэтому там вводятся категории итераторов.

...
Скажите пожалуйста на счёт : " в самом начале главы "Итераторы" стандарта ..." Что это за учебник? Если можно скинте,пожалуйста, ссылочку
0
18.08.2011, 22:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2011, 22:37
Привет! Вот еще темы с ответами:

итератор - C++
Привет всем! подскажите пожалуйста литературу где подробно описана реализация итераторов ...

итератор - C++
Привет. Не получается создать итератор. std::vector&lt;std::list&lt;size_t&gt; &gt; adjacentList; если пишу так ...

Итератор - C++
Добрый день. Я начинающий. Есть проект пытаюсь сделать построение-отладку выдает ошибку типа: Ошибка 1 error C2061: синтаксическая...

Потоковый итератор - C++
Добрый день. Читаю книгу Объектно-ориентированное программирование в С++ Лафоре, там приводится такой код: #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru