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

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

Войти
Регистрация
Восстановить пароль
 
Xtir
12 / 12 / 0
Регистрация: 10.07.2010
Сообщений: 130
#1

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

28.11.2011, 02:53. Просмотров 763. Ответов 7
Метки нет (Все метки)

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();
};
я просто пример привёл, а как правильно написать что бы удалить себя из массива, я хз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 02:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как удалить себя из массива vector? (C++):

Как удалить последний элемент контейнера vector - C++
Доброго вечера всем!!!Подскажите пожалуйста как удалить последний элемент контейнера vector,уменьшив его длину тем самым на 1...

Как удалить первые три элемента в std::vector? - C++
Добрый вечер! у меня есть вектор vector&lt;MyClass&gt; v; где MyClass - какой-либо мой класс, допустим вектор заполнен на 6 ячеек. Как...

Как из массива получить другой, где элементы первого массива перемножены на самих себя - C++
Как из массива получить другой, где элементы первого массива перемножены на самих себя?(Если можно то скиньте код)

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>) - C++
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

Как корректно скопировать vector в vector внутри класса - C++
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt; codeList); ~test(); ...

Динамически создать и удалить vector - C++
Доброго времени суток у меня имеется двумерный vector объектов класса,добавляю туда элементы создавая одномерный veсtor и push_back к...

7
Bers
Заблокирован
28.11.2011, 03:05 #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;
}
1
Xtir
12 / 12 / 0
Регистрация: 10.07.2010
Сообщений: 130
28.11.2011, 03:15  [ТС] #3
ну мне не надо весь массив чистить, только себя удалить, а для этого erase надо...
и вот так правильнее:
C++
1
vec[0].RemoveFromArray();
0
Bers
Заблокирован
28.11.2011, 04:26 #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;
}
Из-за того, что при удалении внутри происходит сначала поиск, а потом сдвиг данных, данный алгоритм довольно таки медленный.
Можно придумать что нибудь по-оптимальнее.
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
28.11.2011, 10:28 #5
Xtir, я не думаю, что пассажир должен удалять сам себя. Это как-то нелогично.
0
Xtir
12 / 12 / 0
Регистрация: 10.07.2010
Сообщений: 130
04.12.2011, 19:23  [ТС] #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, я не думаю, что пассажир должен удалять сам себя. Это как-то нелогично.
ну например для того что бы пересадить этого пассажира на другой "автобус"
0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.12.2011, 19:33 #7
Цитата Сообщение от Xtir Посмотреть сообщение
ну например для того что бы пересадить этого пассажира на другой "автобус"
"Пассажир" не должен удалять сам себя, он должен сообщить об этом "автобусу", который вычеркнет его из списка "пассажиров".
0
Bers
Заблокирован
04.12.2011, 19:36 #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 Посмотреть сообщение
ну например для того что бы пересадить этого пассажира на другой "автобус
Я бы сделал инвариантный автобус, и инвариантного пассажира. Что бы не иметь проблем, из-за переусложненной логики, которая потенциально таит в себе опасности.
0
04.12.2011, 19:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2011, 19:36
Привет! Вот еще темы с ответами:

Удалить элемент из std::vector - C++
vector&lt;int&gt; k; надо удалить k элемент.

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? - C++
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Как обращаться к vector<vector>? - C++
добрый день не подскажите, как обращаться к такой структуре: vector&lt;vector&lt;pair&lt;bool, string&gt;&gt;&gt; v; v....

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main - C++
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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