| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > неявное преобразование итератора в указатель |
| Автор: neosapient 22.12.2009, 12:09 | ||||
| Здравствуйте. В VC6 использовал следующий прием для копирования элементов в контейнере: переопределял операцию присваивания значения по указателю. Далее в коде пробую присвоить значение элементу через итератор указывающий на другой элемент в vectore. VC6 спокойно воспринимает преобразование из итератора в указатель. VC9 ругается на подобное преобразование.
Подскажите, как правильно переписать пример для VC9 ? Вот код примера
|
| Автор: bsa 22.12.2009, 12:16 | ||||
neosapient, MyStruct &operator=(const MyStruct *other) - вообще выкини.
|
| Автор: neosapient 22.12.2009, 13:12 | ||||
| Ещё один вопрос, по обратной задаче Преобразую итератор к NULL-евому указателю. Но компилятор ругается. Как это можно исправить.
|
| Автор: bsa 22.12.2009, 21:34 |
| neosapient, ты видимо вообще не понимаешь, что такое итератор. Итератор - это объект, который ведет себя как указатель. В частности, есть итераторы ввода (std::istream_iterator) и вывода (std::ostream_iterator)... Как ты их преобразуешь в указатели? Итератор, обычно, это способ доступа к данным контейнера. Соответственно, контейнер всегда имеет методы, которые позволяют узнать начальный итератор и конечный (который ни на что не ссылается - аналог NULL). Эти методы у стандартных контейнеров называются begin() и end() (или rbegin() и rend(), если нужна обратная последовательность перебора). Таким образом, когда итератор после ряда операций приращения стал равен end(), то достигнут конец данных. В твоем случае есть смысл заменить на Iter = Vect.end(), только имей в виду, что Vect.end() != NULL и операция if (Iter) {}, если скомпилируется, то будет всегда true. |
| Автор: Earnest 23.12.2009, 07:29 |
| neosapient, в старой среде VC^6 действительно использовалась версия STL, где итераторы, по крайней мере, вектора и были реализованы как указатели. Но уже с 7й версии это не так. Итератор - не указатель! Но преобразовать итератор к указателю на элемент легко: CItem* pItem = &(*iter), где iter - это итератор контейнера, в котором лежат CItem. Т.е. сначала разыменовываем и получаем ссылку на элемент, а потом берем адрес. Вот наоборот сделать нельзя (в общем случае) - т.е. из указателя в итератор. Т.е. для вектора-то можно всегда, пользуясь тем, что память обязательно непрерывна, а вот для других контейнеров - очень сильно зависит от реализации STL, и не все это позволяют. Грубо говоря, нужно смотреть, есть ли у итератора открытый конструктор от ссылки или указателя на значение. Так что не стоит так делать. |
| Автор: Adjusly 24.1.2023, 01:11 |
Модератор: Сообщение скрыто. |