Форум программистов, компьютерный форум CyberForum.ru

Удаления элемента Vector-а по имени - C++

Восстановить пароль Регистрация
 
Devilox
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 90
21.02.2014, 21:45     Удаления элемента Vector-а по имени #1
У меня есть вот такая функция создания экземпляра класса в динамической памяти:
C++
1
2
3
4
5
6
7
8
9
dxDot* dxCreateDot(float x, float y, char symbol) {
    dxDot* Temp = new dxDot(x, y, symbol);
    DotsArray.push_back(*Temp);
 
    return Temp;
 
    delete Temp;
    Temp = 0;
}
Мне нужно написать что-то подобное для удаления экземпляра класса dxDot. Очистка места в памяти понятна, а вот в массиве типа vector - нет. Читал про итераторы, но их ведь тоже нужно инициализировать, а как удалять - непонятно (пробовал через указатель - не получается). Что в таком случае необходимо делать?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6428 / 3802 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
21.02.2014, 21:52     Удаления элемента Vector-а по имени #2
Цитата Сообщение от Devilox Посмотреть сообщение
У меня есть вот такая функция создания экземпляра класса в динамической памяти
Начать с того, что эта функция с утечкой и вообще делает совсем не то, что вы думаете.
Вот правильный вариант:
C++
1
2
3
4
dxDot* dxCreateDot(float x, float y, char symbol) {
    DotsArray.push_back(dxDot(x, y, symbol));
    return &DotsArray.back();
}
Ну и уточняющий вопрос. По какому критерию нужно удалять? (от этого зависит ответ)
Devilox
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 90
21.02.2014, 21:59  [ТС]     Удаления элемента Vector-а по имени #3
DrOffset, мне нужно осуществить то же удаление, что и при вызове .erase(i), но по указателю(если, конечно, это возможно).
Megabar
22 / 22 / 3
Регистрация: 01.12.2013
Сообщений: 93
21.02.2014, 22:08     Удаления элемента Vector-а по имени #4
Devilox, если объект расположен в автоматическом классе памяти, сделать .erase(i) будет достаточно.
если объект динамический, делаете delete DotsArray[i], а потом .erase(i)
Devilox
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 90
21.02.2014, 22:17  [ТС]     Удаления элемента Vector-а по имени #5
Megabar, проблема лишь в том, что нужно инициализировать итератор, чего делать мне не очень-то хочется. Можно ли обойтись ссылками или указателями? (Или же я преувеличиваю с итераторами, и они проще, чем мне кажутся?)
DrOffset
6428 / 3802 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
21.02.2014, 22:29     Удаления элемента Vector-а по имени #6
Цитата Сообщение от Devilox Посмотреть сообщение
DrOffset, мне нужно осуществить то же удаление, что и при вызове .erase(i), но по указателю(если, конечно, это возможно).
В случае вектора можно получить индекс элемента просто посчитав разницу указателей:
C++
1
size_t index = std::distance(&vec[0], ptr);
где ptr - искомый для удаления указатель.

Но здесь скрыта еще одна проблема. Т.к. вектор хранит свои элементы в непрерывной памяти, при добавлении новых элементов сохраненные указатели на элементы могут стать невалидными. В случае итератора на элемент вектора - произойдет тоже самое.
Тут есть несколько вариантов.
Можно сменить тип контейнера на тот, который не инвалидирует итераторы при добавлении. Например std::list (соответственно использовать итераторы list).
Либо можно сменить тип указателя на элемент на что-нибудь независимое, например на индекс.
Можно в векторе вообще не хранить объекты, а хранить только указатели на них. Но тогда для поиска значения по указателю придется делать цикл по всем элементам. А в конце еще пробежаться по содержимому и вызвать всем delete.
Каждый из вариантов потребует переписывания функций удаления\добавления.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.02.2014, 22:36     Удаления элемента Vector-а по имени #7
Инициализируй итератор с помощью remove. Потом освобождай память и удаляй через erase!
Devilox
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 90
21.02.2014, 22:36  [ТС]     Удаления элемента Vector-а по имени #8
Спасибо)
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.02.2014, 22:40     Удаления элемента Vector-а по имени #9
DrOffset, вообще-то у него не указатель на элемент вектора, а вектор указателей.(указатели произвольные на объекты в куче)
DrOffset
6428 / 3802 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
21.02.2014, 22:42     Удаления элемента Vector-а по имени #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Про индексы я зря сказал, потому что если вы будете удалять из середины - придется их пересчитывать.
Плюс вектор не очень хорош на задачах (опять же потому, что требует непрерывности), где нужно удалять из середины коллекции.
В общем, как мне кажется, лучший вариант (с учетом удаления из середины) вот такой:
C++
1
2
3
4
5
6
7
8
9
10
11
// 1
// или std::deque 
// используем везде итераторы вместо указателей
std::list<dxDot>::iterator dxCreateDot(float x, float y, char symbol) {
    return DotsList.insert(DotsList.end(), dxDot(x, y, symbol));
}
 
void dxRemoveDot(std::list<dxDot>::iterator remIter)
{
    DotsList.erase(remIter);
}
Добавлено через 1 минуту
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
вообще-то у него не указатель на элемент вектора, а вектор указателей.(указатели произвольные на объекты в куче)
Вообще-то в его первом посте явно видно, что указатель он разыменовывает. Так что это спорное утверждение.
Devilox
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 90
21.02.2014, 22:49  [ТС]     Удаления элемента Vector-а по имени #11
Спасибо за помощь! Тут новой информации мне ещё на неделю. Буду разбираться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2014, 22:58     Удаления элемента Vector-а по имени
Еще ссылки по теме:

Удаление элемента из std::vector<> C++
C++ Передача vector с i-го элемента
Формирования массивов Y и Z, определения максимального по модулю элемента, удаления элемента C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6428 / 3802 / 882
Регистрация: 30.01.2014
Сообщений: 6,601
21.02.2014, 22:58     Удаления элемента Vector-а по имени #12
Цитата Сообщение от Devilox Посмотреть сообщение
Или же я преувеличиваю с итераторами, и они проще, чем мне кажутся?
В случае, когда указатели принадлежат некой последовательности - они являются частным случаем итератора. Помните об этом, когда будете с ними работать. У итераторов STL сохранена семантика указателя, т.е:
Его можно разыменовать, чтобы получить значение.
Для него определена операция -> для обращения к данным или методам объекта.
Yandex
Объявления
21.02.2014, 22:58     Удаления элемента Vector-а по имени
Ответ Создать тему
Опции темы

Текущее время: 00:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru