![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
fuckingniger |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
имеется указатель на элемент vector-а
Необходимо его удалить из вектора функция erase требует итератор как быть? |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Используйте итераторы. За ссылки на элементы STL контейнера вас вообще следовало бы жестоко наказать. И да, вы в курсе, что удаление элемента из вектора - дорогая операция? Используйте списки. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
afiskon, ну насчет дорогой операции преувеличивать не стоит; весь вопрос в том сколько там элементов, мы же не знаем.
Формально, да, дорогая. Но на практике часто использование вектора предпочтительнее по многим причинам (чем других контейнеров). Так что все зависит... Что касается получения итератора, то для вектора как раз все вполне законно. Стандарт гарантирует, что элементы вектора занимают непрерывную память, так что конструкция типа CMyVector::iterator it = vector.begin() + (pointer_to_element - &vector[0]) работать должна всегда. Но к другим контейнерам это не относится. Использовать указатель на элемент вместо итератора иногда просто суровая необходимость. Например, если нужно сохранять ссылки на элементы вектора в интерфейсных элементах, типа строк таблицы или чего-то вроде. Там обычно доступно что-то вроде пользовательских данных размером DWORD. Указатель туда влезет, а вот итератор - не факт. Но, конечно, если ситуация допускает использование итераторов, то лучше их использовать, без перехода на указатели. -------------------- ... |
|||
|
||||
fuckingniger |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
||||
|
||||
fuckingniger |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
и таки на этой строчке у меня вылетает программа поиск делается корректно Добавлено через 11 минут и 20 секунд я догадался что надо по другому
|
||||
|
|||||
fuckingniger |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
но тут возникла странная проблема запускаю программу - работает - если в отладке - то перестает работать
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ну и на фига тебе такие уродские конструкции? Сделай, чтобы функция find_vector_value возвращала итератор, и будет тебе щастье.
Я уж молчу о том, что можно просто find_if + предикат использовать. Деление на 4 - это ты просто отжог! У тебя что, указатель на байт find_vector_value возвращает? Уже жалею, что показала тебе как итератор из указателя получить... ![]() Если find_vector_value возвращает именно тот тип (указатель), который лежит в векторе, то никаких делений быть не должно. Проверь пошагово все возвращаемые значения (т.е. распиши отдельно все возвращаемые значения, чтобы можно было посмотреть отладчиком). Где-то лажа. -------------------- ... |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |