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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 182
#1

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

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

Есть вектор, состоящий из объектов какого-то класса.
Есть объект принадлежащий этому классу.
На вход методу приходит этот объект и его надо удалить из вектора. Как это сделать?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2016, 17:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление из вектора объектов (C++):

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

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

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

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

Как освободить память из-под вектора объектов? - C++
vector<TObj*> obj; obj.push_back(new obj()); obj.erase(obj.begin()+indx);//удаляю указатель который указывал на объект "Для...

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

18
ThePlague
101 / 101 / 61
Регистрация: 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
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 182
08.02.2016, 17:30  [ТС] #3
C++
1
res[i].getA()
т.е. еще написать такой метод или это встроенный?
0
Croessmah
Эксперт CЭксперт С++
13412 / 7563 / 855
Регистрация: 27.09.2012
Сообщений: 18,614
Записей в блоге: 3
Завершенные тесты: 1
08.02.2016, 17:33 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 182
08.02.2016, 18:15  [ТС] #5
Croessmah, Я правильно понимаю, что при этом оставшиеся справа элементы вектора сдвигаются влево на позицию?
0
Croessmah
Эксперт CЭксперт С++
13412 / 7563 / 855
Регистрация: 27.09.2012
Сообщений: 18,614
Записей в блоге: 3
Завершенные тесты: 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
feck
7 / 7 / 1
Регистрация: 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
Ilot
Модератор
Эксперт С++
1818 / 1176 / 232
Регистрация: 16.05.2013
Сообщений: 3,108
Записей в блоге: 5
Завершенные тесты: 1
09.02.2016, 11:49 #8
Цитата Сообщение от feck Посмотреть сообщение
Это из-за того, что
C++
1
 std::remove(vec.begin(), vec.end(), obj)
только копирует и оставляет указатель на последний элемент, в который был скопирован, а "хвост" оставляет не тронутым, а vec.erase(...,vec.end()) как раз подчищает хвост с того указателя?
Да. Ни один алгоритм stl не изменяет реальный размер контейнера, т.к. согласно ее идиоме алгоритмы ничего не знают о контейнерах.
0
feck
7 / 7 / 1
Регистрация: 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::Struct1>>>,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
Croessmah
Эксперт CЭксперт С++
13412 / 7563 / 855
Регистрация: 27.09.2012
Сообщений: 18,614
Записей в блоге: 3
Завершенные тесты: 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
feck
7 / 7 / 1
Регистрация: 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
Croessmah
Эксперт CЭксперт С++
13412 / 7563 / 855
Регистрация: 27.09.2012
Сообщений: 18,614
Записей в блоге: 3
Завершенные тесты: 1
10.02.2016, 16:23 #12
C++
1
2
3
4
           bool operator ==(const TSrcRef &rhv) const //перегрузка оператора присваивания и здесь же ошибка 
        {
            return *shpSrc == *rhv.shpSrc ;
        }
1
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 182
10.02.2016, 16:45  [ТС] #13
Croessmah, пишет, что no operator == matches these operands. Operand types are Class2==Class2.
Надо убрать "звездочки"?

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

Добавлено через 27 минут
Croessmah, и еще вопрос, почему == принимает одно значение? Должно же быть вроде два?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2016, 17:17
Привет! Вот еще темы с ответами:

Вектор объектов разных классов. Доступ к свойствам элемента вектора - C++
есть базовый класс class A { //... } есть производные классы class A1 : public A { //... public:

Удаление из вектора - C++
#include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;algorithm&gt; using namespace std; void print(vector &lt;int&gt; randomNumbers); int main() ...

Удаление из вектора - C++
1)В программе используется вектор которых хранит объекты некоторого класса, можно ли удалить из его середины(любого произвольного места)...

Удаление из двумерного вектора - C++
Привет всем! у меня такой вопрос...создал двумерный вектор и хочу удалить i строку и i столбец...а получается так что удаляет i строка и...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
10.02.2016, 17:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru