Здравствуйте, Аноним, Вы писали:
А>подскажите существует ли аналог set с возможностью обращения по индексу?
Конечно. В узлах двоичных деревьев поиска, через которые часто реализован std::set, можно хранить размеры поддеревьев — этой информации достаточно чтобы реализовать доступ к элементу множества по индексу за то же время O(logN).
А>или аналог vector c сохранением уникальности как в set
Это же просто делается. Берётся std::vector и поддерживается в сортированном состоянии. Для операций с таким вектором в STL уже есть std::set_intersection, std::set_difference и другие алгоритмы. Вставка делается через std::lower_bound + провека на несовпадение элемента + vector.insert.
по идее, такие контейнеры должны быть, ключевые слова sorted array, sorted vector
поднимал однажды аналогичный вопрос, но готового решения так и не нашел: http://www.rsdn.ru/forum/cpp.applied/4445477
Здравствуйте, Аноним, Вы писали:
А>подскажите существует ли аналог 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).
Т.е. если у тебя в основном поиск, а вставки/удаления редки или их вообще нет, то это то, что доктор прописал.
В примере показывается использование 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> >
А сложнее?
Здравствуйте, 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 с возможностью обращения по индексу? WM>Конечно. В узлах двоичных деревьев поиска, через которые часто реализован std::set, можно хранить размеры поддеревьев — этой информации достаточно чтобы реализовать доступ к элементу множества по индексу за то же время O(logN).
Обращение по индексу в массиве (std::vector) — это O(1), а не O(log(N))