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

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

Восстановить пароль Регистрация
 
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
08.02.2016, 17:04     Удаление из вектора объектов #1
Есть вектор, состоящий из объектов какого-то класса.
Есть объект принадлежащий этому классу.
На вход методу приходит этот объект и его надо удалить из вектора. Как это сделать?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ThePlague
 Аватар для ThePlague
95 / 95 / 59
Регистрация: 30.06.2015
Сообщений: 262
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;
        }
}
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
08.02.2016, 17:30  [ТС]     Удаление из вектора объектов #3
C++
1
res[i].getA()
т.е. еще написать такой метод или это встроенный?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,929
Записей в блоге: 2
Завершенные тесты: 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) ;
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
08.02.2016, 18:15  [ТС]     Удаление из вектора объектов #5
Croessmah, Я правильно понимаю, что при этом оставшиеся справа элементы вектора сдвигаются влево на позицию?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,929
Записей в блоге: 2
Завершенные тесты: 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
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
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()) как раз подчищает хвост с того указателя?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
09.02.2016, 11:49     Удаление из вектора объектов #8
Цитата Сообщение от feck Посмотреть сообщение
Это из-за того, что
C++
1
 std::remove(vec.begin(), vec.end(), obj)
только копирует и оставляет указатель на последний элемент, в который был скопирован, а "хвост" оставляет не тронутым, а vec.erase(...,vec.end()) как раз подчищает хвост с того указателя?
Да. Ни один алгоритм stl не изменяет реальный размер контейнера, т.к. согласно ее идиоме алгоритмы ничего не знают о контейнерах.
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
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> ]
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,929
Записей в блоге: 2
Завершенные тесты: 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
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
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;
        }
            /////////////////
       };
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,929
Записей в блоге: 2
Завершенные тесты: 1
10.02.2016, 16:23     Удаление из вектора объектов #12
C++
1
2
3
4
           bool operator ==(const TSrcRef &rhv) const //перегрузка оператора присваивания и здесь же ошибка 
        {
            return *shpSrc == *rhv.shpSrc ;
        }
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
10.02.2016, 16:45  [ТС]     Удаление из вектора объектов #13
Croessmah, пишет, что no operator == matches these operands. Operand types are Class2==Class2.
Надо убрать "звездочки"?

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

Добавлено через 27 минут
Croessmah, и еще вопрос, почему == принимает одно значение? Должно же быть вроде два?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,929
Записей в блоге: 2
Завершенные тесты: 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 ;
        }
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
10.02.2016, 17:43  [ТС]     Удаление из вектора объектов #17
Croessmah, Понял про внешнюю перегрузку. Про внутреннюю тоже понял, только как определить в произвольном случае, какой первый параметр(который уже есть и хотя бы его имя)?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,929
Записей в блоге: 2
Завершенные тесты: 1
10.02.2016, 17:59     Удаление из вектора объектов #18
Цитата Сообщение от feck Посмотреть сообщение
Про внутреннюю тоже понял, только как определить в произвольном случае, какой первый параметр(который уже есть и хотя бы его имя)?
Здесь уже я немного не понял.
В не статические функции-члены неявно передается указатель на "текущий" объект - this.
this->shpSrc или просто shpSrc, компилятор сам сделает через this.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2016, 13:00     Удаление из вектора объектов
Еще ссылки по теме:

C++ Удаление из вектора нескольких объектов
C++ Удаление из двумерного вектора
C++ Сортировка объектов вектора

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

Или воспользуйтесь поиском по форуму:
feck
7 / 7 / 1
Регистрация: 19.03.2010
Сообщений: 179
11.02.2016, 13:00  [ТС]     Удаление из вектора объектов #19
Croessmah, я имел ввиду для произвольного класса, не моего. Делать через this, значит?
Yandex
Объявления
11.02.2016, 13:00     Удаление из вектора объектов
Ответ Создать тему
Опции темы

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