Вад
|
|
« Ответ #30 : 25-05-2010 07:02 » |
|
Алексей1153++, Вад, не понял чего вам не понравилось
А мне не не понравилось Это раз уж Лёша начал по-научному извращаться, то я свои пять копеек вставил.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #31 : 25-05-2010 07:16 » |
|
Таки что порекомендуете использовать вместо std::vector, когда нужен динамический массив?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #32 : 25-05-2010 07:55 » |
|
так можно и динамический массив. Но это возня с выделением и удалением в конструкторе/деструкторе и в других местах класса. А вектор объявил и почти забыл
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #33 : 25-05-2010 07:57 » |
|
RXL, я предпочитаю дек для хранения крупных объектов, а вектор в основном, как промежуточное хранилище для передачи по сети сложных объектов вообще каждый случай индивидуален, поэтому .... вектор я не люблю использовать из повышенных требований к наличию непрерывного блока памяти, когда у тебя данных сотни мегабайт, это может быть важно push_back приводит к реалокациям, а реалокация на фоне new в соседнем потоке фрагментирует память вообще, я его недолюбливаю из-за особенностей моей работы, а не от того что он весь такой плохой просто мне он неподходит
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #34 : 25-05-2010 08:06 » |
|
push_back приводит к реалокациям,
так push_back использовать необязательно же, можно работать как с обычным массивом, зарезервировав память заранее
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #35 : 25-05-2010 09:54 » |
|
можно, но не всегда удобно, особенно, если ты не знаешь сколько данных будет загружено и они могут загружаться после начальной загрузки в неограниченном объёме
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #36 : 25-05-2010 10:03 » |
|
LogRus, ну это как раз уже то, что "другая задача"
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #37 : 25-05-2010 10:33 » |
|
selectedWorkers.erase(std::find(selectedWorkers.begin(), selectedWorkers.end(), key));
Здесь selectedWorkers представляет собой std::CONTAINER<int>. Задача - удалить элемент со значением key из списка. Попробовал заменить CONTAINER c vector на deque и получил ошибку компиляции: template argument _InputIter passed to 'find' is a output iterator: input iterator required Не пойму, что я тут не так сделал... Вроде как deque имеет тот же интерфейс, что и vector, но немного расширенный для работы с началом списка. UPD: отбой - это предупреждения, а не ошибки. Видимо в BCB6 кривая реализация STL.
|
|
« Последнее редактирование: 25-05-2010 11:34 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #38 : 25-05-2010 11:06 » |
|
#include <deque> #include <algorithm>
std::deque<int> selectedWorkers;
selectedWorkers.erase(std::find(selectedWorkers.begin(), selectedWorkers.end(), 7));
а у меня скомпилировалось
|
|
|
Записан
|
|
|
|
Rustam
Гость
|
|
« Ответ #39 : 25-05-2010 11:09 » |
|
не отходите далеко от темы ребята =)
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #40 : 25-05-2010 11:14 » |
|
RXL, что за компилятор и STL?
если тебе нужно добавлять и удалять числа, то может просто использовать set?
|
|
|
Записан
|
Странно всё это....
|
|
|
Антон (LogRus)
|
|
« Ответ #41 : 25-05-2010 11:14 » |
|
Rustam, ну проблему решили можно и поболтать
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #42 : 25-05-2010 11:35 » |
|
LogRus, не, мне нужен упорядоченный список. Выше я написал - это оказалось некритичным предупреждением. Сейчас попробую, как работает.
Замена vector на deque у меня работает.
|
|
« Последнее редактирование: 25-05-2010 11:37 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #43 : 25-05-2010 12:07 » |
|
LogRus, не, мне нужен упорядоченный список. Выше я написал - это оказалось некритичным предупреждением. Сейчас попробую, как работает.
Замена vector на deque у меня работает.
ну у меня предупреждений а кто сказал, что set нельзя как упорядоченный список использовать?
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #44 : 25-05-2010 13:58 » |
|
LogRus, пока не вижу в описании std::set, что это упорядоченный список...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #45 : 25-05-2010 16:37 » |
|
std::set<int> s; for(std::set<int>::iterator it=s.begin(); it != s.end(); ++it) { ................ }
так вот: итератор возвращает элементы в порядке возрастания чем не список? пример: http://cplusplus.com/reference/stl/set/begin/
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #46 : 25-05-2010 16:41 » |
|
Наверно я не так выразился: под упорядоченным я имел в виду не сортированный, а в порядке помещения элементов в контейнер. Ассоциативные контейнеры не могут обеспечить тот же порядок без дополнительной поддержки.
|
|
« Последнее редактирование: 25-05-2010 16:43 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #47 : 25-05-2010 17:08 » |
|
стоп, если он не отсортированный, то код не рабочий selectedWorkers.erase(std::find(selectedWorkers.begin(), selectedWorkers.end(), 7));
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #48 : 25-05-2010 17:16 » |
|
С чего бы он вдруг стал нерабочий?
1. std::find(selectedWorkers.begin(), selectedWorkers.end(), 7) Возвращает итератор, указывающий на элемент со значением 7.
2. selectedWorkers.erase(.....) Удаляет элемент по итератору.
Все согласно спецификации STL для последовательных контейнеров. Кстати, работает.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #49 : 25-05-2010 17:34 » |
|
потому, что find работает, только с отсортированными диапазонами
|
|
|
Записан
|
Странно всё это....
|
|
|
Антон (LogRus)
|
|
« Ответ #50 : 25-05-2010 17:37 » |
|
а нет гоню, find работает любых массивах т.к. он использует простой перебор элементов, что ИМХО ацтой, хотя задачи бывают разные
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #51 : 25-05-2010 17:44 » |
|
LogRus, хм, вот только хотел написать, что с вполне неупорядоченным вектором find работает ))
|
|
« Последнее редактирование: 25-05-2010 17:49 от Алексей1153++ »
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #52 : 25-05-2010 17:45 » |
|
давно не пользовался, всё больше индексы и ассоциативные контейнеры, уже и забыл про простой перебор
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #53 : 25-05-2010 18:07 » |
|
Пока я тут читал доки, вы уже разобрались... Но, все же, чтобы добру не пропадать привожу тест. #include <stdio.h> #include <vector> #include <algorithm>
typedef std::vector<int> list_int_t;
void print_list(list_int_t &list) { list_int_t::iterator it;
for (it = list.begin(); it != list.end(); it++) printf("%d ", *it);
puts(""); }
int main() { list_int_t list;
// Заполняем список. list.push_back(5); list.push_back(4); list.push_back(3); list.push_back(7); list.push_back(2); list.push_back(8); list.push_back(1); list.push_back(7);
// Выводим начальное состояние списка. puts("Вывод содержимого списка (1)"); print_list(list);
// Удаляем элемент со значением 7. list.erase(find(list.begin(), list.end(), 7));
// Выводим конечное состояние списка. puts("Вывод содержимого списка (2)"); print_list(list);
return 0; }
$ g++ -Wall -o t2 t2.cpp $ ./t2
Вывод содержимого списка (1) 5 4 3 7 2 8 1 7 Вывод содержимого списка (2) 5 4 3 2 8 1 7
У меня под рукой книженция "STL. Карманный справочник." (ISBN 5-469-00389-2): Некоторое количество алгоритмов требует отсортированных интервалов или иначе использует функции сравнения для проверки отношений «меньше». ... Не знаю, может это имеет отношение к нашему вопросу...
|
|
« Последнее редактирование: 25-05-2010 18:15 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #54 : 25-05-2010 18:17 » |
|
Я тоже предпочитаю map, но если нет уникального ключа или нужен определенный порядок хранения, то использую vector (теперь уже deque).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Вад
|
|
« Ответ #55 : 25-05-2010 18:21 » |
|
Я тоже предпочитаю map, но если нет уникального ключа или нужен определенный порядок хранения, то использую vector (теперь уже deque).
Для таких случаев есть multiset и multimap, не требующие уникального ключа.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #56 : 25-05-2010 18:29 » |
|
Но с ними не так удобно работать, как с map и vector. Затрудняюсь найти им применение в своей практике.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #57 : 25-05-2010 18:36 » |
|
я multimap применял, когда в качестве ключа использовалось время. Могло повторяться )
|
|
|
Записан
|
|
|
|
|