Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как из указателя получить итератор произвольного д


Автор: fuckingniger 20.6.2011, 01:32
имеется указатель на элемент vector-а
Необходимо его удалить  из вектора
функция erase требует итератор
как быть?

Автор: afiskon 20.6.2011, 06:41
Цитата

имеется указатель на элемент vector-а

Используйте итераторы. За ссылки на элементы STL контейнера вас вообще следовало бы жестоко наказать.

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

Автор: Earnest 20.6.2011, 08:41
afiskon, ну насчет дорогой операции преувеличивать не стоит; весь вопрос в том сколько там элементов, мы же не знаем.
Формально, да, дорогая. Но на практике часто использование вектора предпочтительнее по многим причинам (чем других контейнеров). Так что все зависит...
Что касается получения итератора, то для вектора как раз все вполне законно. Стандарт гарантирует, что элементы вектора занимают непрерывную память, так что конструкция типа CMyVector::iterator it = vector.begin() + (pointer_to_element - &vector[0]) работать должна всегда. 
Но к другим контейнерам это не относится. 
Использовать указатель на элемент вместо итератора иногда просто суровая необходимость. Например, если нужно сохранять ссылки на элементы вектора в интерфейсных элементах, типа строк таблицы или чего-то вроде. Там обычно доступно что-то вроде пользовательских данных размером DWORD. Указатель туда влезет, а вот итератор - не факт. 
Но, конечно, если ситуация допускает использование итераторов, то лучше их использовать, без перехода на указатели.

Автор: fuckingniger 20.6.2011, 12:14

Цитата(Earnest @  20.6.2011,  08:41 Найти цитируемый пост)
конструкция типа CMyVector::iterator it = vector.begin() + (pointer_to_element - &vector[0]) работать должна всегда. 

 и правда

Автор: fuckingniger 20.6.2011, 18:01
Код

using_coord.erase(  using_coord.begin() +   (    find_vector_value(last.X,last.Y,using_coord) - & using_coord[0]) );

и таки на этой строчке у меня вылетает программа
поиск делается корректно

Добавлено через 11 минут и 20 секунд
я догадался что надо по другому
Код

using_coord.erase(  using_coord.begin() +   (    find_vector_value(last.X,last.Y,using_coord) - & using_coord[0])/4 );

Автор: fuckingniger 20.6.2011, 18:27
но тут возникла странная проблема запускаю программу - работает - если в отладке - то перестает работать

Автор: Earnest 21.6.2011, 11:51
Ну и на фига тебе такие уродские конструкции? Сделай, чтобы функция find_vector_value возвращала итератор, и будет тебе щастье.
Я уж молчу о том, что можно просто find_if + предикат использовать.
Деление на 4 - это ты просто отжог! У тебя что, указатель на байт find_vector_value возвращает? Уже жалею, что показала тебе как итератор из указателя получить... smile  
Если find_vector_value возвращает именно тот тип (указатель), который лежит в векторе, то никаких делений быть не должно. 
Проверь пошагово все возвращаемые значения (т.е. распиши отдельно все возвращаемые значения, чтобы можно было посмотреть отладчиком).
Где-то лажа.

Автор: boostcoder 21.6.2011, 12:50
Цитата(Earnest @  21.6.2011,  11:51 Найти цитируемый пост)
Уже жалею, что показала тебе как итератор из указателя получить

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)