Здравствуйте, Аноним, Вы писали:
А>подскажите существует ли аналог set с возможностью обращения по индексу? или аналог vector c сохранением уникальности как в set
Здравствуйте, Alexander G, Вы писали:
AG>В чём вообще практический смысл примера и контейнера flat_set в целом ?
В том, что он реализуется в виде сортированного вектора, с соответствующими ништяками (быстрый поиск, нулевой оверхед по памяти, быстрая итерация — все за счет того, что все данные лежат рядом) и недостатками (вставка/удаление приводят к инвалидации всего и вся и копированию почти всего содержимого).
Both std::lower_bound and set::find take time proportional to log N, but the constants of proportionality are very different. Using g++ (...) it takes X seconds to perform a million lookups in a sorted vector<double> of a million elements, and almost twice as long (...) using a set. Moreover, the set uses almost three times as much memory (48 million bytes) as the vector (16.8 million).
Т.е. если у тебя в основном поиск, а вставки/удаления редки или их вообще нет, то это то, что доктор прописал.
по идее, такие контейнеры должны быть, ключевые слова sorted array, sorted vector
поднимал однажды аналогичный вопрос, но готового решения так и не нашел: http://www.rsdn.ru/forum/cpp.applied/4445477
Здравствуйте, iking, Вы писали:
I>я надеялся что I>
I>s.begin()[1] = 3;
I>
I>не позволит так сделать, так как элемент с таким ключом уже есть, получается что как set работает только на insert
Также как и boost::container::set, и MSVC std::set.
Наверное это удобно для тех случаев, в которых упорядочивание зависит нет от всего элемента множества + map был бы не удобен.
I>>>P.S. возможно ли ограничить допускаемых значений? допустим flat_set<int> в диапазоне от 3 до 19? EP>>конечно: flat_set< bounded_int<3,19> > I>А сложнее? I>
Здравствуйте, Аноним, Вы писали:
А>подскажите существует ли аналог set с возможностью обращения по индексу?
Конечно. В узлах двоичных деревьев поиска, через которые часто реализован std::set, можно хранить размеры поддеревьев — этой информации достаточно чтобы реализовать доступ к элементу множества по индексу за то же время O(logN).
А>или аналог vector c сохранением уникальности как в set
Это же просто делается. Берётся std::vector и поддерживается в сортированном состоянии. Для операций с таким вектором в STL уже есть std::set_intersection, std::set_difference и другие алгоритмы. Вставка делается через std::lower_bound + провека на несовпадение элемента + vector.insert.
vector как set
От:
Аноним
Дата:
27.10.12 07:01
Оценка:
подскажите существует ли аналог set с возможностью обращения по индексу? или аналог vector c сохранением уникальности как в set
В примере показывается использование operator[] на значении возвращённом begin(), что является ответом на часть вопроса ТС.
А>>>подскажите существует ли аналог set с возможностью обращения по индексу? или аналог vector c сохранением уникальности как в set
In Simple Associative Containers, where the elements are the keys, the elements are completely immutable; the nested types iterator and const_iterator are therefore the same.
Быстро поискав в C++03 — чего-то похожего не нашёл.
I>P.S. возможно ли ограничить допускаемых значений? допустим flat_set<int> в диапазоне от 3 до 19?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, iking, Вы писали:
I>>что как то не очень получается.
EP>а там и set такой же. EP>gcc'шный set так не компилится, в то время как msvc'шный — компилится. EP>В SGI написано: EP>
EP>In Simple Associative Containers, where the elements are the keys, the elements are completely immutable; the nested types iterator and const_iterator are therefore the same.
EP>Быстро поискав в C++03 — чего-то похожего не нашёл.
я надеялся что
s.begin()[1] = 3;
не позволит так сделать, так как элемент с таким ключом уже есть, получается что как set работает только на insert
I>>P.S. возможно ли ограничить допускаемых значений? допустим flat_set<int> в диапазоне от 3 до 19?
EP>конечно: flat_set< bounded_int<3,19> >
А сложнее?
А>>подскажите существует ли аналог set с возможностью обращения по индексу? WM>Конечно. В узлах двоичных деревьев поиска, через которые часто реализован std::set, можно хранить размеры поддеревьев — этой информации достаточно чтобы реализовать доступ к элементу множества по индексу за то же время O(logN).
Обращение по индексу в массиве (std::vector) — это O(1), а не O(log(N))