2010-09-24 1 views
1

Для небольших коллекций std :: vector - почти наверняка лучший контейнер, независимо от того, какие операции применяются к нему. Возможно ли иметь std :: vector в качестве базового хранилища для контейнера элементов, а не красно-черного дерева, включающего много распределений кучи (может быть, у boost есть что-то?), Или я должен сам его изобрести?Можно ли установить для std :: vector базовое хранилище для хранения его элементов?

Plain std :: vector and std :: sort не является параметром из-за причин производительности, а std :: inplace_merge подвержен ошибкам кодирования (недействительность итераторов и т. Д.).

EDIT: выяснен вопрос

+0

Согласны с -1 - ваш q может быть яснее. Образец кода? –

+0

Его вопрос имеет смысл для меня. Кажется, он спрашивает, можно ли указать std :: set для сохранения отсортированного вектора как внутреннего хранилища, а не красного/черного дерева, которое оно обычно использует. –

+0

@Tyler - я согласен с тем, что, скорее всего, –

ответ

2

Невозможно указать базовую структуру набора STL. В лучшем случае вы можете написать распределитель, который использует вектор, чтобы обеспечить память, используемую набором, который может или не может быть тем, что вы хотите.

+0

короткие и простые – 2010-09-24 18:38:04

1

Если вы имеете в виду вы можете иметь

std::set<std::vector<MyType> > myIdealContainer; 

то ответ да, если вы способны осмысленно обернуть вектор в чем-то, что делает его сортировкой (поэтому набор может заказать его участников). Однако следите за неэффективностью копирования.

Если вы имеете в виду, я могу создать экземпляр с вектором в качестве хранилища для пользовательского распределителя, тогда я не знаю, как вы это сделаете (или почему бы вам хотелось).

Если вы имеете в виду, можете ли вы относиться к вектору так же, как и к набору, тогда ответ будет отрицательным. если ваш набор данных мал, и соответствующий член контейнера дешев, используйте вектор, сохраняйте порядок на вставках и сканируйте линейно для совпадений, используя std :: find. Если набор данных большой и/или сопоставление стоит дорого, используйте set.

1

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

в вашем случае

используя функциональные возможности векторных сделок (сортировка, уникальность) для размера хранения

с использованием набора делает противоположное

Если вы необходимо сортировка и уникальность, затем выберите контейнер с этой функцией, если вы не уверены в его плохом торговом отношении

+0

интересный - первые 2 ответа дают противоположный совет :-) – pm100

+0

с использованием std :: set для хранения 10 целых чисел - это избыток, поскольку IIRC, распределитель по умолчанию вызовет оператора new и будет стоить не менее нескольких сотен процессорных циклов для каждого распределения. Использование std :: vector может снизить эту стоимость на порядок – 2010-09-24 18:33:48

+0

, поэтому на современном процессоре она будет стоить 500 (скажем) * 10 = 5000 циклов. Т.е. 5-10 микросекунд; доказывая мою точку зрения. – pm100

0

Нет, невозможно указать con tainer для использования для std::set, вы можете сделать это только с помощью контейнерных адаптеров, таких как std::queue или std::stack. std::set - один из базовых контейнеров с собственным требованием к производительности. std::vector не может быть лучшим контейнером для всех случаев. Например, из вы хотите получить хорошую производительность поиска, которую вы бы выбрали набор, как и find является O(log n) где, как для вектора это O(n)

+0

Эти коллекции невелики. Таким образом, std :: set не является жизнеспособным из-за высокой константы, скрытой в O (1) для вставки. – 2010-09-24 18:36:53

0

Может быть, я неправильно понял вас, но если вы пытаетесь использовать зЬй :: набор, который имеет std :: vector для хранения данных (поэтому все данные набора фактически хранятся в векторе), тогда ответ должен быть «no».
Причина этого заключается в том, что реализация C++ std :: set представляет собой двоичное дерево поиска, а std :: vector управляет простым массивом/блоком памяти.

0

Я думаю, что вы ищете boost::container::flat_set

flat_set похож на StD :: установлен, но он реализован как упорядоченная вектор.