Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложение итераторов, код не компилируется 
:(
    Опции темы
zim22
Дата 15.1.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Код из книги перепечатал, который находит середину вектора.
Код

vector<int> v1(10, 0);
vector<int>::iterator mid = (v1.begin() + v1.size()) / 2;

Код не компилируется, я думаю опечатка, т.к. оператор / не определён для векторов.
Надо так?   
Код
 (v1.begin() + v1.size() / 2); 


Если в пред.примере была опечатка, то это странно для меня, т.к. в двух местах книги сразу опечатки встречаются.

Дальше идёт в книге упражнение: "Что случится, если вычислить итератор след.образом:"
Код

vector<int>::iterator mid = (v1.begin() + v1.end()) / 2;

Код, ясное дело не компилируется.  Я думаю, что случилось бы следующее: т.к. v1.end() указывает на элемент, след.за последним, то итератор mid будет установлен не на средину контейнера, на на одну позицию правее средины. Прав ли я?

И ещё не компилируется даже такой код:
Код

vector<int>::iterator mid = ivec.begin() + ivec.end();


Итераторы же поддерживают оператор + . Почему тогда код не работает?

P.S. Я бы не обратил внимание на опечатки(всмысле исправил бы их), если бы была другая книга. Но это "С++ Primer" 4 издание. Издание книги русское. Опечатки редактора... ? %)
А вдруг просто мой компилятор не поддерживает этот код... У меня Microsoft Visual Studio Professional Edition 2008
В общем, я в растерянности. Помогите.

Это сообщение отредактировал(а) zim22 - 15.1.2009, 15:01


--------------------
PM MAIL   Вверх
mrbrooks
Дата 15.1.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



zim22, итераторы по сути указатели. как и указатели, итераторы указывают на объекты. но применительно к итераторам речь идет об указании на один из элементов набора объектов, хранящихся в некоем контейнере.

в общем бери учебник по STL и кури его, а пепел вдохни. 

Это сообщение отредактировал(а) mrbrooks - 15.1.2009, 15:23
PM MAIL   Вверх
mes
Дата 15.1.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



думаю что книга написана под какой то старый компилятор.
для исправления тебе помогут функции advance и distance.

почитать о них можно например здесь :
http://www.cplusplus.com/reference/std/ite...r/distance.html
http://www.cplusplus.com/reference/std/iterator/advance.html

В частности для вектора  (random-access iterator) можно обойтись без advance  :
Код

   vector<int>::iterator mid = v1.begin() + distance(v1.begin(),v1.end())/2;




Это сообщение отредактировал(а) mes - 15.1.2009, 15:20


--------------------
PM MAIL WWW   Вверх
zim22
Дата 15.1.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



спасибо за ответы. stl буду курить, когда время прийдёт. а пока запомню полезную функцию distance.


--------------------
PM MAIL   Вверх
bsa
Дата 16.1.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zim22, складывать итераторы нельзя, так как результат не имеет смысла - что будет если сложить в почтовом адресе номера двух домов? Делить тоже. Опять же, представляем номер дома, деленный на два.
Для итераторов случайного доступа определен только оператор вычитание: если вычесть из одного итератора другой итератор, то получишь количество элементов, которое находится между ними. (Т.е. если вычесть из дома №10 дом №5, то получится, что между ними 5 домов)
Так же можно прибавлять/вычитать к/из итераторам целые числа - это смещение итераторов на указанное число элементов.
PM   Вверх
lv151
Дата 16.1.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



А что за книга?
PM MAIL   Вверх
bsa
Дата 16.1.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



lv151
Цитата(zim22 @ 15.1.2009,  15:00)
это "С++ Primer" 4 издание. Издание книги русское.

http://www.ozon.ru/context/detail/id/2988768/ smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.