lists must go?
От: c-smile Канада http://terrainformatica.com
Дата: 24.07.10 05:22
Оценка: 2 (1) -2 :))
Известно что для списков на каждый элемент приходится по одному или двум дополнительных указателей.

Т.е. на list<int> в 10 элементов требует памяти 120 байт.
Тогда как для vector<int> 40 байт.

В реальных задачах элементы могут участвовать в нескольких списках одновременно что усугубляет проблему потребления памяти в списках.
Я тут проанализирвал все свои проекты — на примерно 45 vector<>/hash_map<> коллекций приходится один случай использования l2element<> ( интрузивный список ).

У вектора можно спросить size, его можно эффективно отсортировать. С вектором можно использовать ranges. И прочие радости жизни.

Философические вопросы:

Зачем нужны эти list<>?

Допуская что в некоторых случаях list<> могут быть полезны зададимся вопросом:

А нафига тогда эта вселенская абстракция по имени iterator?

Если реально итерируемыми контейнерами являются vector<> и list<>, list<> уходит в небытие — остается vector<>.
А для него есть очень эффективные и удобные ranges. А для всех остальных случаев перебора можно использовать абстракцию stream<T>.

Вот такие вот мои мысли. Обсудим?
Re: lists must go?
От: FR  
Дата: 24.07.10 05:43
Оценка: +1 :)
Здравствуйте, c-smile, Вы писали:

CS>Вот такие вот мои мысли. Обсудим?


Рулят немутабельные списки, за счет бесплатного разделения данных и кучи наработанных в функциональщине алгоритмов под них.
Re: lists must go?
От: FR  
Дата: 24.07.10 05:46
Оценка: 3 (1) +1
Здравствуйте, c-smile, Вы писали:

CS>Известно что для списков на каждый элемент приходится по одному или двум дополнительных указателей.


CS>Т.е. на list<int> в 10 элементов требует памяти 120 байт.

CS>Тогда как для vector<int> 40 байт.

Ну список не обязательно реализовывать канонически, штуки типа http://en.wikipedia.org/wiki/VList по потреблению памяти близки к вектору.
Re: lists must go?
От: tripol  
Дата: 24.07.10 06:26
Оценка: 1 (1)
Здравствуйте, c-smile, Вы писали:

CS>Известно что для списков на каждый элемент приходится по одному или двум дополнительных указателей.


CS> Зачем нужны эти list<>?


CS>Допуская что в некоторых случаях list<> могут быть полезны зададимся вопросом:


CS> А нафига тогда эта вселенская абстракция по имени iterator?


CS>Если реально итерируемыми контейнерами являются vector<> и list<>, list<> уходит в небытие — остается vector<>.

CS>А для него есть очень эффективные и удобные ranges. А для всех остальных случаев перебора можно использовать абстракцию stream<T>.


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

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

По большому счету с помощью stream нельзя запомнить позицию и вернуться к ней.
Re[2]: lists must go?
От: c-smile Канада http://terrainformatica.com
Дата: 24.07.10 06:50
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, c-smile, Вы писали:


CS>>Известно что для списков на каждый элемент приходится по одному или двум дополнительных указателей.


CS>>Т.е. на list<int> в 10 элементов требует памяти 120 байт.

CS>>Тогда как для vector<int> 40 байт.

FR>Ну список не обязательно реализовывать канонически, штуки типа http://en.wikipedia.org/wiki/VList по потреблению памяти близки к вектору.


Ну дык в .NET List<> это вообще vector<>. Там еще добавляется требование минимизации кол-ва указателей — меньше работы GC.

Собственно я об этом и вопрошаю — на кой они сдались эти списки когда есть гораздо более эффективные конструкции?
Единственный practical use case для списков это интрузивные списки. А для них итерация это do ... while(pel = pel->next); — т.е. next есть свойство самого элемента ибо коллекции как таковой нет.
Re[3]: lists must go?
От: FR  
Дата: 24.07.10 06:55
Оценка:
Здравствуйте, c-smile, Вы писали:


CS>Ну дык в .NET List<> это вообще vector<>. Там еще добавляется требование минимизации кол-ва указателей — меньше работы GC.


CS>Собственно я об этом и вопрошаю — на кой они сдались эти списки когда есть гораздо более эффективные конструкции?

CS>Единственный practical use case для списков это интрузивные списки. А для них итерация это do ... while(pel = pel->next); — т.е. next есть свойство самого элемента ибо коллекции как таковой нет.

Ну еще есть во всяком случае в C++ такое свойство что итераторы на список не умирают при изменении списка, чего не
скажешь об итераторах на вектор.
А так тоже правило от Александреску "используй по умолчанию vector" в целом верно, но всегда могут найтись задачи для которых
лучше подходит list.
Re: lists must go?
От: Centaur Россия  
Дата: 24.07.10 07:25
Оценка: 1 (1)
Здравствуйте, c-smile, Вы писали:

CS> Зачем нужны эти list<>?


Списки не инвалидируют итераторы/указатели/ссылки при вставке и удалении элементов. Списки можно splice’ить.
Re: lists must go?
От: Guard_h4s Россия  
Дата: 24.07.10 09:01
Оценка: +1
Здравствуйте, c-smile, Вы писали:

CS>Вот такие вот мои мысли. Обсудим?

У вектора есть одно неприятное свойство — он не дает строгой гарантии безопасности при возникновении исключений, а только базовую(вставка элемента в контейнер). Там где нужно обеспечить строгую гарантию будут накладные расходы достаточно большие(полное копирование вектора и своп)
Re: lists must go?
От: morm Россия  
Дата: 24.07.10 09:03
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Известно что для списков на каждый элемент приходится по одному или двум дополнительных указателей.


CS>Т.е. на list<int> в 10 элементов требует памяти 120 байт.

CS>Тогда как для vector<int> 40 байт.

CS>В реальных задачах элементы могут участвовать в нескольких списках одновременно что усугубляет проблему потребления памяти в списках.

CS>Я тут проанализирвал все свои проекты — на примерно 45 vector<>/hash_map<> коллекций приходится один случай использования l2element<> ( интрузивный список ).

CS>У вектора можно спросить size, его можно эффективно отсортировать. С вектором можно использовать ranges. И прочие радости жизни.


CS>Философические вопросы:


CS> Зачем нужны эти list<>?


CS>Допуская что в некоторых случаях list<> могут быть полезны зададимся вопросом:


CS> А нафига тогда эта вселенская абстракция по имени iterator?


CS>Если реально итерируемыми контейнерами являются vector<> и list<>, list<> уходит в небытие — остается vector<>.

CS>А для него есть очень эффективные и удобные ranges. А для всех остальных случаев перебора можно использовать абстракцию stream<T>.

CS>Вот такие вот мои мысли. Обсудим?


В списках хорошо хранить объекты работающие с ресурсами ОС или железа. Например, рекордсеты БД, у которых деструктор закрывает соединение и т.п.
Re: lists must go?
От: dilmah США  
Дата: 24.07.10 09:27
Оценка:
CS>Т.е. на list<int> в 10 элементов требует памяти 120 байт.
CS>Тогда как для vector<int> 40 байт.

ну так не используй list<int>

делай лист из больших структур для которых эти указатели дают считанные проценты оверхеда.

хотя, действительно, я лично на практике list не помню когда использовал.
Re[2]: lists must go?
От: c-smile Канада http://terrainformatica.com
Дата: 24.07.10 18:57
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, c-smile, Вы писали:


CS>> Зачем нужны эти list<>?


C>Списки не инвалидируют итераторы/указатели/ссылки при вставке и удалении элементов. Списки можно splice’ить.


То что список как структура данных имеет свои уникальные свойства — понятно и никем не оспаривается.
Конечно же есть *алгоритмы* для которых требуются такие уникальные свойства.
Проблема в том что неинтрузивные списки как коллекции не эффективны. А с интрузивными списками концепция итераторов как-то не вяжется.
Тогда вся концепция итераторов как обобщения выглядит весьма ограниченной — фактически iterators эффективны только для векторов.
Re[2]: lists must go?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.07.10 19:30
Оценка:
Здравствуйте, tripol, Вы писали:

T>List нужен когда необходимо часто вставлять и удалять элементы. У вектора эта операция будет приводить

T>в среднем к копированию половины вектора при каждой операции, что может оказаться гораздо медленнее.

В листе точно так же.
Re[3]: lists must go?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.07.10 19:36
Оценка: +2 :)
Здравствуйте, c-smile, Вы писали:

CS>Ну дык в .NET List<> это вообще vector<>. Там еще добавляется требование минимизации кол-ва указателей — меньше работы GC.


CS>Собственно я об этом и вопрошаю — на кой они сдались эти списки когда есть гораздо более эффективные конструкции?


У списков есть большое преимущество — алгоритмическая сложность некоторых операций.

Кроме того, у списков есть большой недостаток — алгоритмическая сложность некоторых операций.

Re: lists must go?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.07.10 19:36
Оценка:
Граждане сиплюсники !

Указывайте пожалуйста что речь о С++.
Re[3]: lists must go?
От: tripol  
Дата: 24.07.10 19:44
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, tripol, Вы писали:


T>>List нужен когда необходимо часто вставлять и удалять элементы. У вектора эта операция будет приводить

T>>в среднем к копированию половины вектора при каждой операции, что может оказаться гораздо медленнее.

I>В листе точно так же.


Вы про C++-шный std::list<> ?
Re[4]: lists must go?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.07.10 19:49
Оценка:
Здравствуйте, tripol, Вы писали:

T>>>List нужен когда необходимо часто вставлять и удалять элементы. У вектора эта операция будет приводить

T>>>в среднем к копированию половины вектора при каждой операции, что может оказаться гораздо медленнее.

I>>В листе точно так же.


T>Вы про C++-шный std::list<> ?


Нет
Re[3]: lists must go?
От: Aleх  
Дата: 24.07.10 22:48
Оценка: +2
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Centaur, Вы писали:


C>>Здравствуйте, c-smile, Вы писали:


CS>>> Зачем нужны эти list<>?


C>>Списки не инвалидируют итераторы/указатели/ссылки при вставке и удалении элементов. Списки можно splice’ить.


CS>То что список как структура данных имеет свои уникальные свойства — понятно и никем не оспаривается.

CS>Конечно же есть *алгоритмы* для которых требуются такие уникальные свойства.
CS>Проблема в том что неинтрузивные списки как коллекции не эффективны. А с интрузивными списками концепция итераторов как-то не вяжется.
CS>Тогда вся концепция итераторов как обобщения выглядит весьма ограниченной — фактически iterators эффективны только для векторов.

Ну вообще то концепция итераторов не ограничивается списком и вектором. Итераторы эффективны там где нужно делать обход сложной структуры данных.
Например, сбалансированного дерева.
Re[3]: lists must go?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.07.10 22:55
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Проблема в том что неинтрузивные списки как коллекции не эффективны. А с интрузивными списками концепция итераторов как-то не вяжется.


А что можно предложить взамен ?

Итератор это всего лишь отделение обхода от структуры.

CS>Тогда вся концепция итераторов как обобщения выглядит весьма ограниченной — фактически iterators эффективны только для векторов.


С какой точки зрения эффективны ?
Re[3]: lists must go?
От: FR  
Дата: 25.07.10 04:03
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>В листе точно так же.


В нормальных кошерных списках не так.
Явовские и шарповские коллеции не списки а недоразумения
Re[2]: lists must go?
От: FR  
Дата: 25.07.10 04:05
Оценка: +4 :)))
Здравствуйте, Ikemefula, Вы писали:

I>Граждане сиплюсники !


I>Указывайте пожалуйста что речь о С++.


Наоборот гражданам явщикам и нетчикам надо указывать что они называют списком убогий массив с ограничениями
Re[3]: lists must go?
От: FR  
Дата: 25.07.10 04:32
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>То что список как структура данных имеет свои уникальные свойства — понятно и никем не оспаривается.

CS>Конечно же есть *алгоритмы* для которых требуются такие уникальные свойства.

Есть еще одна штука большинство алгоритмов на списках легко обобщаются на деревья и более сложные структуры
данных. Те же B-Tree T-Tree тоже во многом списки.

CS>Проблема в том что неинтрузивные списки как коллекции не эффективны. А с интрузивными списками концепция итераторов как-то не вяжется.


Есть вполне эффективные реализации списков.

CS>Тогда вся концепция итераторов как обобщения выглядит весьма ограниченной — фактически iterators эффективны только для векторов.


Угу итераторы уже всеми кому не лень критикуются и в общем по делу. Всякие ranges, enums и т. п. лучше.
Re[4]: lists must go?
От: tripol  
Дата: 25.07.10 04:33
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Ikemefula, Вы писали:


I>>В листе точно так же.


FR>В нормальных кошерных списках не так.

FR>Явовские и шарповские коллеции не списки а недоразумения

В этих языках нет указателей, поэтому, наверное, такая "хитрая"
замена...
Re[5]: lists must go?
От: FR  
Дата: 25.07.10 05:03
Оценка:
Здравствуйте, tripol, Вы писали:

T>В этих языках нет указателей, поэтому, наверное, такая "хитрая"

T>замена...

В NET указатели есть.
Ну и без полноценных указателей вполне можно списки сделать, вот например на ссылках (ref) OCaml
http://caml.inria.fr/resources/doc/guides/pointers.en.html
Re[2]: lists must go?
От: shrecher  
Дата: 25.07.10 05:28
Оценка: -1
Здравствуйте, tripol, Вы писали:


T>List нужен когда необходимо часто вставлять и удалять элементы. У вектора эта операция будет приводить

T>в среднем к копированию половины вектора при каждой операции, что может оказаться гораздо медленнее.


это вы все проблемы std::vector, здесь основной недостаток, что std::vector, хочет вызывать операцию копирования для каждого своего элемента. Это долго, т.к. непозволяет массово копировать элементы. std::vector слишком абстрактный — содан для любых типов элементов. Если хранимый элемент "простой", т.е. ему достаточно просто скопировать свою занимаемую память, то для очень больших массивов данных std::vector неэффективен.

Я сделал свои вектора, которые ненастолько "абстрактны" как std, но зато позволяют копировать свое содержимое как memmove: сдвигаем область памяти на размер ячейки умноженный на длину "хвоста" вправо, что-то вроде: "memmove( base + (insert_pos)*size_item, base + (insert_pos+1)*size_item, (len-insert_pos)*size_item );"

Операция memcpy/memmove очень быстра, даже несколько гигабайт копируются за микросекунды. Вставка в прозвольное положение для такого вектора примерно как в std::list.
Re[6]: lists must go?
От: tripol  
Дата: 25.07.10 05:40
Оценка:
Здравствуйте, FR, Вы писали:

FR>В NET указатели есть.


В "unsafe code" правда.

FR>Ну и без полноценных указателей вполне можно списки сделать, вот например на ссылках (ref) OCaml

FR>http://caml.inria.fr/resources/doc/guides/pointers.en.html

С OCaml я не знаком, но в принципе ссылки и указатели это почти одно и то же.
Re[3]: lists must go?
От: FR  
Дата: 25.07.10 05:40
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Операция memcpy/memmove очень быстра, даже несколько гигабайт копируются за микросекунды. Вставка в прозвольное положение для такого вектора примерно как в std::list.


Чуть чуть попадаем в swap и микросекунды превращаются в десятки секунд
Re[4]: lists must go?
От: c-smile Канада http://terrainformatica.com
Дата: 25.07.10 06:01
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, shrecher, Вы писали:


S>>Операция memcpy/memmove очень быстра, даже несколько гигабайт копируются за микросекунды. Вставка в прозвольное положение для такого вектора примерно как в std::list.


FR>Чуть чуть попадаем в swap и микросекунды превращаются в десятки секунд


Все лучше чем с list который вообще может при *каждом* обращении к элементу в swap ходить.
Re[3]: lists must go?
От: tripol  
Дата: 25.07.10 06:12
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Здравствуйте, tripol, Вы писали:


S>Операция memcpy/memmove очень быстра, даже несколько гигабайт копируются за микросекунды. Вставка в прозвольное положение для такого вектора примерно как в std::list.


Хочу несколько поправить. Два гигабайта в двухканальном режиме дают минимальное время
2(объем данных) / 19.2Гб/c * 2(двухканальный режим) / 2(операция чтения + записи) = 0.1секунды

При 100 операциях понадобится времени около 5 секунд, при тысяче — 50 секунд и т.д.

http://ru.wikipedia.org/wiki/DDR3_SDRAM
Re[5]: lists must go?
От: FR  
Дата: 25.07.10 06:14
Оценка:
Здравствуйте, c-smile, Вы писали:


FR>>Чуть чуть попадаем в swap и микросекунды превращаются в десятки секунд


CS>Все лучше чем с list который вообще может при *каждом* обращении к элементу в swap ходить.


В данном случае (копировании гигабайт при простой вставке) хуже, list в худшем случае поднимет пару страничек
и вполне уложится в микросекунды, а контейнер с memmove еще пару минут погоняет диск

Ну и правильный аллокатор для любых случаев ухода в swap сделает list лучше чем массив.
Re[3]: lists must go?
От: minorlogic Украина  
Дата: 25.07.10 10:11
Оценка:
Здравствуйте, shrecher, Вы писали:


S>это вы все проблемы std::vector, здесь основной недостаток, что std::vector, хочет вызывать операцию копирования для каждого своего элемента. Это долго, т.к. непозволяет массово копировать элементы. std::vector слишком абстрактный — содан для любых типов элементов. Если хранимый элемент "простой", т.е. ему достаточно просто скопировать свою занимаемую память, то для очень больших массивов данных std::vector неэффективен.


S>Я сделал свои вектора, которые ненастолько "абстрактны" как std, но зато позволяют копировать свое содержимое как memmove: сдвигаем область памяти на размер ячейки умноженный на длину "хвоста" вправо, что-то вроде: "memmove( base + (insert_pos)*size_item, base + (insert_pos+1)*size_item, (len-insert_pos)*size_item );"


S>Операция memcpy/memmove очень быстра, даже несколько гигабайт копируются за микросекунды. Вставка в прозвольное положение для такого вектора примерно как в std::list.


Боюсь , заблуждаетесь. POD типы могут копирироваться не медленее memmove (разве что на экстра битом компиляторе может быть разница.) Дизайн вектора не тянет за собой дополнительных расходов, только при неправильном использовании.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: lists must go?
От: minorlogic Украина  
Дата: 25.07.10 10:15
Оценка:
Здравствуйте, c-smile, Вы писали:


CS>Проблема в том что неинтрузивные списки как коллекции не эффективны.

А конкретно? уточните.

CS> А с интрузивными списками концепция итераторов как-то не вяжется.

С чего бы это ?

CS>Тогда вся концепция итераторов как обобщения выглядит весьма ограниченной — фактически iterators эффективны только для векторов.


iterators — как раз, абстракция которая наиболее эффективна. Эфективнее может быть только инкупсуляция перебора элементоа внутрь контейнера
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: lists must go?
От: MxMsk Португалия  
Дата: 25.07.10 10:48
Оценка:
Здравствуйте, tripol, Вы писали:

T>В этих языках нет указателей, поэтому, наверное, такая "хитрая"

T>замена...
Если очень хочется, то в .Net есть LinkedList
Re: lists must go?
От: jazzer Россия Skype: enerjazzer
Дата: 25.07.10 15:27
Оценка: +4
Здравствуйте, c-smile, Вы писали:

CS> Зачем нужны эти list<>?


Т.е. зачем нужны неинтрузивные списки?
Потому что они применимы абсолютно к любому типу (например, int, string, указатели). Поэтому если тебе просто нужен список — берешь std::list и не паришься.

Интрузивные контейнеры — это оптимизация (в данном случае — по памяти).
Которая, естественно, небесплатна: ты платишь значительным ухудшением дизайна класса и заодно сужаешь возможности по его использованию. Например, твой класс не может быть членом одновременно нескольких интрузивных списков, если ты, конечно, не предусмотришь next1, next2 и т.д.
И которая, когда преждевременная, сам знаешь куда должна идти.

CS>А нафига тогда эта вселенская абстракция по имени iterator?


а итераторы никакого отношения к интрузивности/неинтрузивности контейнеров не имеют, это ортогональная концепция.
Равно как и диапазоны (ranges).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: lists must go?
От: c-smile Канада http://terrainformatica.com
Дата: 25.07.10 16:36
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, c-smile, Вы писали:



FR>>>Чуть чуть попадаем в swap и микросекунды превращаются в десятки секунд


CS>>Все лучше чем с list который вообще может при *каждом* обращении к элементу в swap ходить.


FR>В данном случае (копировании гигабайт при простой вставке) хуже, list в худшем случае поднимет пару страничек

FR>и вполне уложится в микросекунды, а контейнер с memmove еще пару минут погоняет диск

Давай начнем с того что коллекции размером с гигабайт это уже будет "переход колличества в качество" —
требуют принципиально других и структур данных и алгоритмов.
Т.е. ни о какой дилемме vector<> vs. list<> тут вообще речи нет.
Re[7]: lists must go?
От: FR  
Дата: 25.07.10 16:52
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Давай начнем с того что коллекции размером с гигабайт это уже будет "переход колличества в качество" —

CS>требуют принципиально других и структур данных и алгоритмов.
CS>Т.е. ни о какой дилемме vector<> vs. list<> тут вообще речи нет.

Это да, но при этом почти наверняка будут использоваться деревья, то есть родня списков.
Re[3]: lists must go?
От: _DAle_ Беларусь  
Дата: 25.07.10 16:56
Оценка: +1
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Ikemefula, Вы писали:


I>>Граждане сиплюсники !


I>>Указывайте пожалуйста что речь о С++.


FR>Наоборот гражданам явщикам и нетчикам надо указывать что они называют списком убогий массив с ограничениями


На самом деле это в С++ какое-то неправильное название. List — это общее название набора неких значений. А вот Linked list — конкретная структура данных. Почему в STL doubly-linked list назвали просто list для меня загадка.
Re[4]: lists must go?
От: FR  
Дата: 25.07.10 17:07
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>На самом деле это в С++ какое-то неправильное название. List — это общее название набора неких значений. А вот Linked list — конкретная структура данных. Почему в STL doubly-linked list назвали просто list для меня загадка.


Первым языком программирования использующим списки был Lisp в нем они были именно линейными связными, так что C++ как и функциональные языки идет в русле традиции, а всякие новомодные языки в количестве двух штук ее нарушают
Re: lists must go?
От: _DAle_ Беларусь  
Дата: 25.07.10 17:10
Оценка:
Здравствуйте, c-smile, Вы писали:

CS> Зачем нужны эти list<>?


Удаление/добавление за O(1) при имеющемся итераторе, splice за O(1) (не везде), отсутствие инвалидации других итераторов после удаления/вставки... Как это ни странно звучит, но как раз list иногда используют вместо vector для экономии памяти. Так как вектор может выделить примерно в два раза больше памяти, чем нужно, при расширении.

CS>Если реально итерируемыми контейнерами являются vector<> и list<>, list<> уходит в небытие — остается vector<>.


Вообще еще и deque есть, который тоже иногда используется.
Re[4]: lists must go?
От: c-smile Канада http://terrainformatica.com
Дата: 25.07.10 17:32
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Здравствуйте, c-smile, Вы писали:



CS>>Проблема в том что неинтрузивные списки как коллекции не эффективны.

M>А конкретно? уточните.

Давай рассмотрим практическую задачу.
Ну скажем устройство DOM элемента в HTML.

namespace dom
{
  class node { ... }
  class element: public node 
  {
     collection<node*> children; /* все дети */
     collection<node*> visuals; /* отображаемые дети */
  }
}


Если collection это list<> то на каждый элемент в children и visuals создается
дополнительно list item в размере 3х указателей.
В случае когда collection<> это vector<> то на каждый элемент имеем один указатель — элемент массива.

CS>> А с интрузивными списками концепция итераторов как-то не вяжется.

M>С чего бы это ?

В случае интрузивного списка node вверху будет выглядеть как:

class node 
{ 
  node* next; //
  node* prev; // children list 
  node* visual_next; //
  node* visual_prev; // visuals list
}


Т.е. для перебора children и visuals используем:
for(node *n = children; n; n = n->next) { ... }
for(node *n = visuals; n; n = n->next_visual) { ... }


Я честно говоря затрудняюсь представить generic механизм интрузивных списков допускающий
one element — N lists комбинации.

CS>>Тогда вся концепция итераторов как обобщения выглядит весьма ограниченной — фактически iterators эффективны только для векторов.


M>iterators — как раз, абстракция которая наиболее эффективна. Эфективнее может быть только инкупсуляция перебора элементоа внутрь контейнера


В случае моего примера:
Итерация по элементам в случае vector<> это итерация по массиву + 1 переход по указателю.
Итерация по элементам в list<> это 2 перехода по указателям.
Т.е. с точки зрения архитектуры процессоров перебор vector<> эффективнее перебора list<>.
Т.е. для итерирования вектор наиболее подходит — для него эта коцепция является "родной".
Для остальных типов коллекций итератор это вельми дорогая и как правило нетривиальная штука.

Я лично склоняюсь к идее генераторов когда мне нужно предоставить абстракцию перебора
по не массивам. Вот кстати как пример: http://www.codeproject.com/KB/cpp/cpp_generators.aspx?msg=2733137#xx2733137xx
Маленькое уточнение
От: minorlogic Украина  
Дата: 25.07.10 18:53
Оценка:
Здравствуйте, c-smile, Вы писали:

Маленькое уточнение , вы не ошиблись , может так ?
class node 
{ 
  node* next; //
  node* prev; // children list current 
  node* visual_next; //
  node* visual_prev; // visuals list current
  
  
  node* children_head; // children list subnodes head
  node* visual_head; // visuals list  subnodes head
}


Или я что то проглядел ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: Маленькое уточнение
От: c-smile Канада http://terrainformatica.com
Дата: 25.07.10 19:04
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Здравствуйте, c-smile, Вы писали:


M>Маленькое уточнение , вы не ошиблись , может так ?

M>
M>  node* children_head; // children list subnodes head
M>  node* visual_head; // visuals list  subnodes head
M>


M>Или я что то проглядел ?


См. class element {}
Т.е. в случае intrusive list

class element 
{
  node* first_child; // children list subnodes head
  node* first_visual_child; // visuals list  subnodes head
}


не все nodes могут имет children. Например text[_node] есть leaf.
Re[5]: lists must go?
От: Roman Odaisky Украина  
Дата: 25.07.10 19:13
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Т.е. для перебора children и visuals используем:

CS>
CS>for(node *n = children; n; n = n->next) { ... }
CS>for(node *n = visuals; n; n = n->next_visual) { ... }
CS>


CS>Я честно говоря затрудняюсь представить generic механизм интрузивных списков допускающий

CS>one element — N lists комбинации.

Самое простое:
range<node, &node::next> r_children(children);
range<node, &node::next_visual> r_visuals(visuals);

Generic — Boost.Intrusive.
До последнего не верил в пирамиду Лебедева.
Re[7]: lists must go?
От: Klapaucius  
Дата: 26.07.10 11:33
Оценка:
Здравствуйте, tripol, Вы писали:

FR>>В NET указатели есть.

T>В "unsafe code" правда.

А где указатели есть в safe code?
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[8]: lists must go?
От: tripol  
Дата: 26.07.10 12:04
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, tripol, Вы писали:


FR>>>В NET указатели есть.

T>>В "unsafe code" правда.

K>А где указатели есть в safe code?


http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx
Re[8]: lists must go?
От: tripol  
Дата: 26.07.10 12:11
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, tripol, Вы писали:


FR>>>В NET указатели есть.

T>>В "unsafe code" правда.

K>А где указатели есть в safe code?


Малость не понял вопрос.
Хрен его знает. В C++ понятия safe code нет, и оно ему не нужно.
Re[8]: lists must go?
От: FR  
Дата: 26.07.10 12:15
Оценка:
Здравствуйте, Klapaucius, Вы писали:


K>А где указатели есть в safe code?


В ATS

http://www.church-project.org/seminar-reading-group/documents/Safe1.ppt
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.59.5572
Re[8]: lists must go?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 21:16
Оценка:
Здравствуйте, Klapaucius, Вы писали:

FR>>>В NET указатели есть.

T>>В "unsafe code" правда.

K>А где указатели есть в safe code?


В обероне
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: lists must go?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 21:19
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>То что список как структура данных имеет свои уникальные свойства — понятно и никем не оспаривается.

CS>Конечно же есть *алгоритмы* для которых требуются такие уникальные свойства.
CS>Проблема в том что неинтрузивные списки как коллекции не эффективны. А с интрузивными списками концепция итераторов как-то не вяжется.
CS>Тогда вся концепция итераторов как обобщения выглядит весьма ограниченной — фактически iterators эффективны только для векторов.

Ну, так может дело не в списках, а в iterators С++?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: lists must go?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 21:23
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А что можно предложить взамен ?


Более простые итераторы которые позволяют только перебрать элементы по порядку. Как я понимаю аналогичную фичу в В назвали диапазонами. А в дотнете она известна под идиотским императивным (но тем не менее вполне приемлемым) интерфейсом IEnumerabl<T>.

I>Итератор это всего лишь отделение обхода от структуры.


Итераторы С++ излишне переусложнены.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: lists must go?
От: tripol  
Дата: 26.07.10 21:32
Оценка: +1 :)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Ikemefula, Вы писали:


I>>А что можно предложить взамен ?


VD>Более простые итераторы которые позволяют только перебрать элементы по порядку. Как я понимаю аналогичную фичу в В назвали диапазонами. А в дотнете она известна под идиотским императивным (но тем не менее вполне приемлемым) интерфейсом IEnumerabl<T>.


I>>Итератор это всего лишь отделение обхода от структуры.


VD>Итераторы С++ излишне переусложнены.


Для пользователя идентично работе с указателями. Для Random итератора
доступны все операторы, которые применимы к указателю, в том числе
адресная арифметика. Для Forward итератора: ++, * и еще может какие.
Что бы этого достичь, конечно нужно больше кода.
Не вижу сложности в их использовании.
Re[9]: lists must go?
От: CreatorCray  
Дата: 27.07.10 08:50
Оценка:
Здравствуйте, tripol, Вы писали:

K>>А где указатели есть в safe code?

T>http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx
Статья там называется "Unsafe Code and Pointers (C# Programming Guide)"
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: lists must go?
От: tripol  
Дата: 27.07.10 09:06
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, tripol, Вы писали:


K>>>А где указатели есть в safe code?

T>>http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx
CC>Статья там называется "Unsafe Code and Pointers (C# Programming Guide)"

малость ошибся...
Re[2]: Маленькое уточнение
От: minorlogic Украина  
Дата: 31.07.10 10:17
Оценка:
Тогда я вдвойне не понимаю где вы видите неэфективность ? Можно просто , одним предложением ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: lists must go?
От: Шахтер Интернет  
Дата: 04.08.10 20:44
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, minorlogic, Вы писали:


M>>Здравствуйте, c-smile, Вы писали:



CS>>>Проблема в том что неинтрузивные списки как коллекции не эффективны.

M>>А конкретно? уточните.

CS>Давай рассмотрим практическую задачу.

CS>Ну скажем устройство DOM элемента в HTML.

CS>
CS>namespace dom
CS>{
CS>  class node { ... }
CS>  class element: public node 
CS>  {
CS>     collection<node*> children; /* все дети */
CS>     collection<node*> visuals; /* отображаемые дети */
CS>  }
CS>}
CS>


CS>Если collection это list<> то на каждый элемент в children и visuals создается

CS>дополнительно list item в размере 3х указателей.
CS>В случае когда collection<> это vector<> то на каждый элемент имеем один указатель — элемент массива.

Ты не совсем прав. vector резервирует память для амортизации push_back, т.е. на самом деле у тебя будет 1.5-2 кратный перерасход памяти в худшем случае. Т.е. быстродействие покупается ценой расхода памяти.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.