Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / vector и удаление произвольного элемента / 25 сообщений из 25, страница 1 из 1
07.02.2004, 11:02
    #32401527
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
дого искал как это делается, нашел такой вариант:
Код: plaintext
1.
2.
3.
4.
5.
vector <string*> v;
...
string *s;//strig for deleting
vector<string*>::iterator i=find(v.begin(),v.end(),s);
v.erase(i);

и такая кнострукция компилится у меня а MinGW gcc 3.2.2 вроде

а вот msvc6 и gcc2.95.3(FreeBSD) не хотят

пришлось делать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
vector <string*> v;
...
string *s;//strig for deleting
for (vector <string*>::iterator i=v.begin();i!=v.end();i++)
  if (*i==s)
    v.erase(i,i);


и так работает и в msvc6 и в gcc2.95.3

А прощще можно?
...
Рейтинг: 0 / 0
07.02.2004, 11:15
    #32401532
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Это ты в помощь мне ???
а то у мя такой же вопрос

____
...
Рейтинг: 0 / 0
07.02.2004, 12:35
    #32401556
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Это я в помощь себе :-) а утебя такой же вопрос, это по поводу кнопочек?
...
Рейтинг: 0 / 0
07.02.2004, 13:07
    #32401571
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Угу :)

а точнее вчера вечером задумался а как удалить какойнить элеиент из вектора ...
____
...
Рейтинг: 0 / 0
08.02.2004, 13:29
    #32401854
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Код: plaintext
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.
//
//  удаление элементов из вектора указателей на string
//
#include <algorithm>
#include <string>
#include <vector>

struct special_equal_to
{
     const std::string &a;

     explicit special_equal_to(const std::string &a) : a(a) {}

     bool operator()(const std::string *b) const
     {
            return (a == (*b));
     }     
};

...

std::vector<std::string *> v;
std::string s;
...
v.erase(std::remove_if(v.begin(), v.end(), special_equal_to(s)), v.end());


Теперь замечание по существу. Зачем вектор указателей, когда вектор строк и безопасней и надеждней?:

Код: plaintext
1.
2.
3.
std::vector<std::string> v;
...
v.erase(std::remove(v.begin(), v.end(), s), v.end());


Удачи.
...
Рейтинг: 0 / 0
08.02.2004, 13:37
    #32401857
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Насчет вектора строк заместо вектора указателей.

Может ты и прав, да только я не догоняю, как туда добавлять элементы :-)

если у меня есть объект
string s;
то он существует в контексте одного блока, разве нет? и удалится автомтически, при выходе из блока.

или как?
...
Рейтинг: 0 / 0
08.02.2004, 13:42
    #32401858
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Ну и что?

Ведь в вектор попадает его копия - разве нет?:)
...
Рейтинг: 0 / 0
08.02.2004, 13:47
    #32401859
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Что происходит при добавлении проиллюстрирует следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class tracer
{
public:
     tracer() {std::cout <<  "tracer::ctor"  << std::endl;}
     tracer(const tracer &other) { std::cout <<  "tracer::copy_ctor"  << std::endl;}
     ~tracer() {std::cout <<  "tracer::dtor"  << std::endl;}
};

...
std::vector<tracer> v;
v.push_back(tracer());
...
Рейтинг: 0 / 0
08.02.2004, 20:27
    #32401979
Shkurenko Alexander
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
2 Анатолий Широков
Теперь замечание по существу. Зачем вектор указателей, когда вектор строк и безопасней и надеждней?

На самом деле, я бы то же поостерёгся использовать вектор строк. Потому что я не знаю внутренности класса строки. Даже если и не происходит "глубокого" копирования, то мне не совсем понятно как класс std::basic_string хранит список частей строк? Ведь насколько мне известно, станларт не обязывает хранить строку одним куском в памяти. И вот тут то и возникают сомнения, что "проще", с одной стороны хранить вектор указателей (очень быстро), а с другой вроде бы и лучше вектор строк (медленно, но бонус в качестве алгоритмов). А как показывает практика - русскому человеку проще изобрести велосипед, но чтобы он ездил очень быстро
...
Рейтинг: 0 / 0
08.02.2004, 21:56
    #32401997
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
по поводу строк, к стати.

в оригинальной задаче у меня не строки а объекты интерфейса :-)
так что, хранить я буду ссылки.

а строки это я для примера привел. чтоб понятней было
...
Рейтинг: 0 / 0
08.02.2004, 22:25
    #32402002
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
В случае необходимости хранить в STL контейнерах указатели на объекты я бы советовал сначало посмотреть чем это черевато (т.е. узнать все подводные камни - их не так уж много - но они могут впервую удивить)

Во-вторых - я бы посмотрел в сторону умных указателей (aka smart pointers) и существующие их реализации (например loki)
...
Рейтинг: 0 / 0
09.02.2004, 03:53
    #32402052
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
А можно в кратце, в двух словах, что такое смартпоинтеры?
...
Рейтинг: 0 / 0
09.02.2004, 10:04
    #32402186
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
В двух словах - это объект, который ведет себя как указатель (т.е. у него перегружены соответсвующие операции)
Такие объекты можно использовать вместо обычных указателей на объекты т.к. кроме функциональности непосредственно указателей еще и такие сервисы как автоматический контроль кол-ва ссылок и своевременное автоматическое удаление объектов на которые указывают
...
Рейтинг: 0 / 0
09.02.2004, 10:13
    #32402204
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
прикольно :-)
loki, это та библиотека на которую vdimas ссылку давал в топике про "не дайте умереть с++" или что-то такое подобное?
...
Рейтинг: 0 / 0
09.02.2004, 10:18
    #32402213
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
может быть - тут на нее кучу ссылок давали - и заслуженно. Loki - это библиотека классов которая была написана для книги "Modern C++ Design" Andrei Alexandrescu. Она как раз и демонстрирует generic programming и design patterns
...
Рейтинг: 0 / 0
09.02.2004, 11:08
    #32402313
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
за неплохими смарт-поинтерами можно ко мне на мыло.

----
генерят самый экономный код в release, лучше чем бустовские и локиевские, работают вообще со всеми контейнерами - STL, MFC, ATL, а так же имеются разновидности для COM. (автоматические неявные QueryInterface для преобразований типов и пр. прелести).
...
Рейтинг: 0 / 0
09.02.2004, 11:12
    #32402326
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
vdimas

Я правильно понял что это что-то типа _COM_SMARTPTR + Loki smart ptr? Если да то это интересно...
...
Рейтинг: 0 / 0
09.02.2004, 18:51
    #32403330
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
--vector и удаление произвольного элемента

vector<String> lst[3];
lst.push_back("aa"); lst.push_back("bb"); lst.push_back("cc");
int idx = 1; // 2-й элемент
lst.erase(lst.begin() + idx);
...
Рейтинг: 0 / 0
09.02.2004, 18:56
    #32403331
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
не...
мне нужно было удалить не по индексу, а по самому объекту.
я храню ссылки на элементы управления, и при определенном событии мне нужно удалить контрол из списка.

такой вариант я уже находил в сети, но все равно спасибо за участие.
пока думаю на тему смартпойнтеров
...
Рейтинг: 0 / 0
12.02.2004, 16:20
    #32407411
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Шёл на работу (или с работы?..)

Подумалось: надо сделать надстройку над классом, и запихать туда указатель на итератор :)

vector<чё-тут?>::iteraor m_pIteratorMe;
...
то есть
push_back(MyObj);
MyObj.m_pIteratorMe = vStr.end();
...
потом просто
vStr.erase(MyObj.m_pIteratorMe);

как вам такой вариант? Заодно расскажите что есть смартпоинтеры :)
...
Рейтинг: 0 / 0
12.02.2004, 17:02
    #32407486
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Да уж рассказывал...
http://www.sql.ru/forum/actualpost.aspx?bid=21&tid=73180&mid=0&p=1#526567

vStr.erase(MyObj.m_pIteratorMe);
сделать можно - вопрос для чего?
...
Рейтинг: 0 / 0
13.02.2004, 10:19
    #32408146
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
Про смартпоинтеры понял, тока не совсем ясно как их тут применить.

funikovyuriсделать можно - вопрос для чего?
Ну так человек просил придумать способ, чтоб не перебирать вектор для поиска удаляемого элемента.
...
Рейтинг: 0 / 0
13.02.2004, 12:32
    #32408477
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
А вот если я понял то происходит это ...
сейчас поясню :)

такс есть у нас std::vector<MyObject*> v;

v.insert(v.begin(),new MyObject);
...
...

теперь удалеем 5-й элемент (пусть мы запихали уже 10 обьектов в вектор)

int index = 4;
v.erase(v.begin()+index);

и теперь если мы обратимся к 6 элементу то
будет как и прежде v[5] ??

а как бы сделать так чтобы в векторе они перемещались ?
тоесть если я удалил 5-й элемент на его место встал 6-й, на 6-й встал 7-й итд.
или нельзя , или это абсурд ?

____
...
Рейтинг: 0 / 0
13.02.2004, 12:59
    #32408553
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
они и так перемещаются :)
...
Рейтинг: 0 / 0
13.02.2004, 13:22
    #32408615
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vector и удаление произвольного элемента
2funikovyuri

точно ???

странно но я не заметил этого ...
надо бы посмотреть

____
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / vector и удаление произвольного элемента / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]