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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как из указателя получить итератор произвольного д, оступа 
:(
    Опции темы
fuckingniger
Дата 20.6.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



имеется указатель на элемент vector-а
Необходимо его удалить  из вектора
функция erase требует итератор
как быть?
PM MAIL   Вверх
afiskon
Дата 20.6.2011, 06:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 4



Цитата

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

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

И да, вы в курсе, что удаление элемента из вектора - дорогая операция? Используйте списки.
PM MAIL WWW   Вверх
Earnest
Дата 20.6.2011, 08:41 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


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


Бывалый
*


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

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




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

 и правда
PM MAIL   Вверх
fuckingniger
Дата 20.6.2011, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

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 );

PM MAIL   Вверх
fuckingniger
Дата 20.6.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



но тут возникла странная проблема запускаю программу - работает - если в отладке - то перестает работать
PM MAIL   Вверх
Earnest
Дата 21.6.2011, 11:51 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


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


pattern`щик
****


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

Репутация: 49
Всего: 110



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

 smile 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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