Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
1

Удаление из вектора объектов

08.02.2016, 17:04. Показов 7609. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть вектор, состоящий из объектов какого-то класса.
Есть объект принадлежащий этому классу.
На вход методу приходит этот объект и его надо удалить из вектора. Как это сделать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2016, 17:04
Ответы с готовыми решениями:

Удаление из вектора нескольких объектов
Собственно как удалить несколько объектов из вектора, имея индексы/итераторы, ведь при удалении...

Добавление и удаление объектов. Рисование объектов на экране
Доброго времени суток. Есть очень интересующий вопрос, как сделать добавление, обновление,...

Сортировка объектов вектора
class Words { public: int number; // Номер в словаре для быстрого поиска string...

Вывод в файл вектора объектов
Приветствую. есть класс Library, в котором 2 вектора с объектами Person и Book. Пишу вывод в файл...

18
104 / 104 / 99
Регистрация: 30.06.2015
Сообщений: 272
08.02.2016, 17:26 2
feck,
C++
1
2
3
4
5
6
7
8
9
void deleteObj(vector<A>&res, A tmp)
{
    for(unsigned int i=0;i<res.size();i++)
        if(res[i].getA()==tmp.getA())
        {
            res.erase(res.begin()+i);
            break;
        }
}
1
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
08.02.2016, 17:30  [ТС] 3
C++
1
res[i].getA()
т.е. еще написать такой метод или это встроенный?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
08.02.2016, 17:33 4
Лучший ответ Сообщение было отмечено feck как решение

Решение

C++
1
2
3
4
5
6
7
8
template<typename T>
void remove_from_vector(std::vector<T>& vec, const T& obj)
{
    vec.erase(std::remove(vec.begin(), vec.end(), obj), vec.end()) ;
}
//...
//using:
remove_from_vector(vec, some_obj) ;
2
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
08.02.2016, 18:15  [ТС] 5
Croessmah, Я правильно понимаю, что при этом оставшиеся справа элементы вектора сдвигаются влево на позицию?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
08.02.2016, 18:29 6
Цитата Сообщение от feck Посмотреть сообщение
что при этом оставшиеся справа элементы вектора сдвигаются влево на позицию?
В удаляемые элементы будут копироваться элементы, которые справа.
Разберите работу кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <algorithm>
 
 
template<typename T>
void remove_from_vector(std::vector<T>& vec, const T& obj)
{
    /*vec.erase(*/std::remove(vec.begin(), vec.end(), obj)/*, vec.end())*/ ;
}
//...
//using:
 
 
 
int main()
{
    std::vector<int> vec{1, 2, 3, 5, 8, 5, 4, 1, 2, 4, 6, 5, 7} ;
    remove_from_vector(vec, 5) ;
    for(int e: vec)
        std::cout << e << ' ' ;
}
http://rextester.com/BAYLM94914
Цитата Сообщение от вывод
1 2 3 8 4 1 2 4 6 7 6 5 7
0
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
09.02.2016, 09:41  [ТС] 7
Croessmah,
Цитата Сообщение от Croessmah Посмотреть сообщение
__________________
Язык C++ - очень странный предмет.
Действительно. Из
C++
1
vec{1, 2, 3, 5, 8, 5, 4, 1, 2, 4, 6, 5, 7}
Удалились элементы "5" на 4 и 6 позиции, а на 12 - нет)
Это из-за того, что
C++
1
std::remove(vec.begin(), vec.end(), obj)
только копирует и оставляет указатель на последний элемент, в который был скопирован, а "хвост" оставляет не тронутым, а vec.erase(...,vec.end()) как раз подчищает хвост с того указателя?
0
Эксперт по математике/физикеЭксперт С++
2047 / 1365 / 395
Регистрация: 16.05.2013
Сообщений: 3,505
Записей в блоге: 6
09.02.2016, 11:49 8
Цитата Сообщение от feck Посмотреть сообщение
Это из-за того, что
C++
1
 std::remove(vec.begin(), vec.end(), obj)
только копирует и оставляет указатель на последний элемент, в который был скопирован, а "хвост" оставляет не тронутым, а vec.erase(...,vec.end()) как раз подчищает хвост с того указателя?
Да. Ни один алгоритм stl не изменяет реальный размер контейнера, т.к. согласно ее идиоме алгоритмы ничего не знают о контейнерах.
0
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
10.02.2016, 11:30  [ТС] 9
Croessmah, появился новый вопрос. Там, где он возник в первый раз - все работает. Но вот в другом месте нет. На вход функции, в которой проблема, подается (SHP_Class2 shpSrc)
C++
1
2
3
Struct1 srcRef;
srcRef.shpSrc = shpSrc;
cllSrcRefs_.erase(std::remove(cllSrcRefs_.begin(), cllSrcRefs_.end(), srcRef), cllSrcRefs_.end());
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef shared_ptr<Class2> SHP_Class2;
 
class Class1 : public boost::noncopyable
{
public:
pivate:
std::vector<Struct1> cllSrcRefs_;
 
struct Struct1
    {
        const char* name()const{ assert(pctxFilter); return pctxFilter->name;}
        SHP_Class2 shpSrc;
        AVFilterContext* pctxFilter = nullptr;
        bool finished       = false;
        bool to_read        = true;
        size_t total_samples= 0;
    };
}
А вот лог ошибок от VS2013 ultimate:
>c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(1734): error C2678: binary '==' : no operator found which takes a left-hand operand of type Class1::Struct1' (or there is no acceptable conversion)
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\thread(202): could be 'bool std::operator ==(std::thread::id,std::thread::id) throw()'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\system_error(410): or 'bool std::operator ==(const std::error_condition &,const std::error_code &) throw()'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\system_error(402): or 'bool std::operator ==(const std::error_code &,const std::error_condition &) throw()'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\exception(507): or 'bool std::operator ==(const std::exception_ptr &,std::nullptr_t)'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\exception(502): or 'bool std::operator ==(std::nullptr_t,const std::exception_ptr &)'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\exception(497): or 'bool std::operator ==(const std::exception_ptr &,const std::exception_ptr &)'
1> c:\program files (x86)\windows kits\8.1\include\shared\guiddef.h(192): or 'bool operator ==(const GUID &,const GUID &)' [found using argument-dependent lookup]
1> while trying to match the argument list '(Class1::Struct1, const Class1::Struct1)'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm(1748) : see reference to function template instantiation '_FwdIt std::_Remove<Class1::Struct1*,_Ty>(_FwdIt,_FwdIt,const _Ty &)' being compiled
1> with
1> [
1> _FwdIt=Class1::Struct1 *
1> , _Ty=Class1::Struct1
1> ]
1> c:\projects\file3.cpp(16) : see reference to function template instantiation '_FwdIt std::remove<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Class1::St ruct1>>>,Class1::Struct1>(_FwdIt,_FwdIt,const _Ty &)' being compiled
1> with
1> [
1> _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Class1::Struct1 >>>
1> , _Ty=Class1::Struct1
1> ]
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
10.02.2016, 14:46 10
Цитата Сообщение от feck Посмотреть сообщение
error C2678: binary '==' : no operator found which takes a left-hand operand of type Class1::Struct1'
Так пишет же, что нет соответствующего оператора сравнения.
Перегрузите оператор сравнения для Struct1.
Ну и оно у Вас noncopyable
0
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
10.02.2016, 15:21  [ТС] 11
Croessmah, я и сам не знаю, как сравнить их...
А noncopyable как влияет на это? Вроде не копирую объект.

Добавлено через 13 минут
Попытался сделать так, но пишет: слишком много аргументов.
C++
1
2
3
4
5
6
7
8
9
10
struct Struct1
    {
           //////////////////
           bool operator ==(TSrcRef &a, TSrcRef &b) //перегрузка оператора присваивания и здесь же ошибка 
        {
            if (a.shpSrc == b.shpSrc) return true;
            else return false;
        }
            /////////////////
       };
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
10.02.2016, 16:23 12
C++
1
2
3
4
           bool operator ==(const TSrcRef &rhv) const //перегрузка оператора присваивания и здесь же ошибка 
        {
            return *shpSrc == *rhv.shpSrc ;
        }
1
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
10.02.2016, 16:45  [ТС] 13
Croessmah, пишет, что no operator == matches these operands. Operand types are Class2==Class2.
Надо убрать "звездочки"?

Добавлено через 13 минут
Не, явно не в этом дело.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
10.02.2016, 16:47 14
Цитата Сообщение от feck Посмотреть сообщение
пишет, что no operator == matches these operands. Operand types are Class2==Class2
Соответственно, для Class2 также должен быть operator==
Никто кроме Вас не знает каким образом нужно
сравнивать объекты Ваших классов
1
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
10.02.2016, 17:17  [ТС] 15
Сейчас уже тоже хотел написать, что походу надо для Class2 тоже перегружать)
Спасибо!

Добавлено через 27 минут
Croessmah, и еще вопрос, почему == принимает одно значение? Должно же быть вроде два?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
10.02.2016, 17:41 16
Цитата Сообщение от feck Посмотреть сообщение
почему == принимает одно значение?
ну так это же член класса, так что первый параметр и так уже есть.
Цитата Сообщение от feck Посмотреть сообщение
Должно же быть вроде два?
Если вне класса делать, то два:
C++
1
2
3
4
           bool operator ==(const TSrcRef &lhv, const TSrcRef &rhv) //перегрузка оператора присваивания и здесь же ошибка 
        {
            return *lhv.shpSrc == *rhv.shpSrc ;
        }
0
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
10.02.2016, 17:43  [ТС] 17
Croessmah, Понял про внешнюю перегрузку. Про внутреннюю тоже понял, только как определить в произвольном случае, какой первый параметр(который уже есть и хотя бы его имя)?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
10.02.2016, 17:59 18
Цитата Сообщение от feck Посмотреть сообщение
Про внутреннюю тоже понял, только как определить в произвольном случае, какой первый параметр(который уже есть и хотя бы его имя)?
Здесь уже я немного не понял.
В не статические функции-члены неявно передается указатель на "текущий" объект - this.
this->shpSrc или просто shpSrc, компилятор сам сделает через this.
1
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
11.02.2016, 13:00  [ТС] 19
Croessmah, я имел ввиду для произвольного класса, не моего. Делать через this, значит?
0
11.02.2016, 13:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2016, 13:00
Помогаю со студенческими работами здесь

Сортировка вектора объектов по полю
Всем доброго времени суток. Знаю, что вопрос часто задаваемый, но я не нашел для себя ответа. В...

Std::sort сортировка вектора объектов
Добрый день. Пытаюсь выполнить сортировку вектора объектов с помощью функции сравнения ...

Предикаты. Выборка объектов из вектора по определённому полю
Здравствуйте. Имеется некий шаблон класса, один из членов которого - вектор. Т.е. что-то вроде ...

Как освободить память из-под вектора объектов?
vector&lt;TObj*&gt; obj; obj.push_back(new obj()); obj.erase(obj.begin()+indx);//удаляю указатель...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru