|
Модераторы: Daevaorn |
|
neosapient |
|
||||
Опытный Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Здравствуйте.
В VC6 использовал следующий прием для копирования элементов в контейнере: переопределял операцию присваивания значения по указателю. Далее в коде пробую присвоить значение элементу через итератор указывающий на другой элемент в vectore. VC6 спокойно воспринимает преобразование из итератора в указатель. VC9 ругается на подобное преобразование.
Подскажите, как правильно переписать пример для VC9 ? Вот код примера
Это сообщение отредактировал(а) neosapient - 22.12.2009, 13:12 |
||||
|
|||||
bsa |
|
||||
Эксперт Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
neosapient, MyStruct &operator=(const MyStruct *other) - вообще выкини.
|
||||
|
|||||
neosapient |
|
||||
Опытный Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Ещё один вопрос, по обратной задаче
Преобразую итератор к NULL-евому указателю. Но компилятор ругается. Как это можно исправить.
|
||||
|
|||||
bsa |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
neosapient, ты видимо вообще не понимаешь, что такое итератор. Итератор - это объект, который ведет себя как указатель. В частности, есть итераторы ввода (std::istream_iterator) и вывода (std::ostream_iterator)... Как ты их преобразуешь в указатели?
Итератор, обычно, это способ доступа к данным контейнера. Соответственно, контейнер всегда имеет методы, которые позволяют узнать начальный итератор и конечный (который ни на что не ссылается - аналог NULL). Эти методы у стандартных контейнеров называются begin() и end() (или rbegin() и rend(), если нужна обратная последовательность перебора). Таким образом, когда итератор после ряда операций приращения стал равен end(), то достигнут конец данных. В твоем случае есть смысл заменить на Iter = Vect.end(), только имей в виду, что Vect.end() != NULL и операция if (Iter) {}, если скомпилируется, то будет всегда true. |
|||
|
||||
Earnest |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
neosapient, в старой среде VC^6 действительно использовалась версия STL, где итераторы, по крайней мере, вектора и были реализованы как указатели. Но уже с 7й версии это не так. Итератор - не указатель! Но преобразовать итератор к указателю на элемент легко:
CItem* pItem = &(*iter), где iter - это итератор контейнера, в котором лежат CItem. Т.е. сначала разыменовываем и получаем ссылку на элемент, а потом берем адрес. Вот наоборот сделать нельзя (в общем случае) - т.е. из указателя в итератор. Т.е. для вектора-то можно всегда, пользуясь тем, что память обязательно непрерывна, а вот для других контейнеров - очень сильно зависит от реализации STL, и не все это позволяют. Грубо говоря, нужно смотреть, есть ли у итератора открытый конструктор от ссылки или указателя на значение. Так что не стоит так делать. -------------------- ... |
|||
|
||||
maxim1000 |
|
|||
Эксперт Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
маленькая добавочка: TContainer::end() вернёт вполне корректный объект-итератор, который не стоит разыменовывать, да и указатель ему никакой не соответствует конечно, для разыменовываемых итераторов такой способ работает -------------------- qqq |
|||
|
||||
Adjusly |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 23.1.2023 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |