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

Как удалить себя из массива vector? - C++

Восстановить пароль Регистрация
 
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
28.11.2011, 02:53     Как удалить себя из массива vector? #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CTest
{
public:
    vector* v;
 
    void RemoveFromArray()
    {
        v->erase(this); //erase' : 2 overloads have no legal conversion for 'this' pointer
    };
};
 
vector <CTest> vec;
 
void main()
{
    CTest t;
    t.v = &vec; //'=' : cannot convert from 'class std::vector<class CTest,class std::allocator<class CTest> > *' to 'class std::vector *'
    vec.push_back(t);
    t.RemoveFromArray();
};
я просто пример привёл, а как правильно написать что бы удалить себя из массива, я хз
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
28.11.2011, 03:05     Как удалить себя из массива vector? #2
http://www.cplusplus.com/reference/stl/vector/clear/

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CTest
{
public:
    std::vector<CTest>* v;  //не забываем указать параметр 
                                        //шаблона вектора
 
    void RemoveFromArray()    {  v->clear();  };
};
 
std::vector <CTest> vec;
 
int main()
{
    CTest t; t.v = &vec;
    
    vec.push_back(t);
    t.RemoveFromArray();
    
    return 0;
}
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
28.11.2011, 03:15  [ТС]     Как удалить себя из массива vector? #3
ну мне не надо весь массив чистить, только себя удалить, а для этого erase надо...
и вот так правильнее:
C++
1
vec[0].RemoveFromArray();
Bers
Заблокирован
28.11.2011, 04:26     Как удалить себя из массива vector? #4
да, кстати, если нужно удалить только отдельного пассажира из вектора (самого себя), тогда картинка будит немножко другой. Два самых простых варианта:

1. Либо вектор хранит адреса объектов, а не сами объекта.
2. Либо, нужно перегрузить оператор==

Так как у тебя идеологически напрашивается второй вариант, то выглядеть это будит нечто вроде так:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <algorithm> //нужен для работы со стандартными алгоритмами
                                //хотя у меня алгоритмы пашут и без этого инклуда
 
class CTest
{
public:
    
    std::vector<CTest>*  v;
    void RemoveFromArray()    
    {  
        std::vector<CTest>::iterator it;
        it = std::find (v->begin(), v->end(), *this);
        v->erase(it);  
    };
 
    int operator==(const CTest& istok)
    {
        return (v==istok.v);
    }
};
 
std::vector<CTest> vec;
 
int main()
{
    CTest t; t.v = &vec;
    
    vec.push_back(t);
    vec.push_back(t);
    
    vec[0].RemoveFromArray();
    
    return 0;
}
Из-за того, что при удалении внутри происходит сначала поиск, а потом сдвиг данных, данный алгоритм довольно таки медленный.
Можно придумать что нибудь по-оптимальнее.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
28.11.2011, 10:28     Как удалить себя из массива vector? #5
Xtir, я не думаю, что пассажир должен удалять сам себя. Это как-то нелогично.
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
04.12.2011, 19:23  [ТС]     Как удалить себя из массива vector? #6
Цитата Сообщение от Bers Посмотреть сообщение
2. Либо, нужно перегрузить оператор==
мне кажется это одно и то же, разницы почему-то не заметил, но заметил такую фигню....
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class CTest
{
public:
    vector <CTest>* v;
    int i;
    void Remove()
    {
        vector <CTest>::iterator it;
        it = find(v->begin(), v->end(), *this);
        v->erase(this);
    }
 
    int operator==(const CTest& t)
    {
        return (v == t.v);
    }
};
 
vector <CTest> v;
 
void main()
{
    CTest* pTest = new CTest;
    int x = 7;
 
    cout << "v = ";
    for(int i = 0; i < 10; ++i)
    {
        CTest t;
        t.i = i;
        t.v = &v;
        v.push_back(t);
        cout << v[i].i << " ";
    }
    cout << endl;
 
    pTest = &v[x];
    cout << "pTest->i = " << pTest->i << endl; //pTest->i = 7
    cout << "pTest->Remove();" << endl;
    pTest->Remove(); //удаляем pTest из массива
    cout << "pTest->i = " << pTest->i << endl; //pTest->i = 8
}
до удаления из массива pTest->i = 7, а после, уже равно 8, как так?
Цитата Сообщение от fasked Посмотреть сообщение
Xtir, я не думаю, что пассажир должен удалять сам себя. Это как-то нелогично.
ну например для того что бы пересадить этого пассажира на другой "автобус"
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.12.2011, 19:33     Как удалить себя из массива vector? #7
Цитата Сообщение от Xtir Посмотреть сообщение
ну например для того что бы пересадить этого пассажира на другой "автобус"
"Пассажир" не должен удалять сам себя, он должен сообщить об этом "автобусу", который вычеркнет его из списка "пассажиров".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2011, 19:36     Как удалить себя из массива vector?
Еще ссылки по теме:

Можно ли удалить объект std::vector, а данные оставить? C++
Можно ли удалить объект экземпляра класса из самого себя? C++
C++ Как удалить первые три элемента в std::vector?

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
04.12.2011, 19:36     Как удалить себя из массива vector? #8
C++
1
2
3
4
5
6
7
8
9
10
11
pTest = &v[x];  //взяли адрес 7 элемента
cout << "pTest->i = " << pTest->i << endl;   //показали его
cout << "pTest->Remove();" << endl;           
pTest->Remove();                                       //удалили его
 
//внутри вектора произошло смещение всех элементов 
//Вектор "уменьшился", "сжался"
//теперь указатель указывает на другой элемент
//шедший следом, за тем, что был удалён
 
cout << "pTest->i = " << pTest->i << endl;
/зы я называю подобные конструктивы "клюкалами"
Потому что оно шаткое, за ним глаз да глаз. В любой момент может сделать "клюк..."
Анекдот про клюкало знаете?)

Данная конструкция имеет:
1. Нарушение инкапсуляции класса.
2. Нарушение инварианта класса.

Вообще, конструкции, в которых внутренние данные классов зависят от корректности манипуляций, выполняемых снаружи ненадежны, и несут в себе потенциальную мину замедленного действия.

Поэтому, в ситуациях, когда:

Цитата Сообщение от Xtir Посмотреть сообщение
ну например для того что бы пересадить этого пассажира на другой "автобус
Я бы сделал инвариантный автобус, и инвариантного пассажира. Что бы не иметь проблем, из-за переусложненной логики, которая потенциально таит в себе опасности.
Yandex
Объявления
04.12.2011, 19:36     Как удалить себя из массива vector?
Ответ Создать тему
Опции темы

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