#c #stl #containers #big-o
Вопрос:
По-видимому; -) стандартные контейнеры обеспечивают некоторую форму гарантий.
Какие гарантии и в чем именно заключаются различия между различными типами контейнеров?
Работа со страницы SGI (о STL) Я придумал это:
Container Types:
================
Container:
Forward Container
Reverse Container
Random Access Container
Sequence
Front Insert Sequence
Back Insert Sequence
Associative Container
Simple Associative Container
Pair Associative Container
Sorted Associative Container
Multiple Associative Container
Container Types mapped to Standard Containers
=============================================
std::vector: Sequence Back Sequence Forward/Reverse/Random Container
std::deque: Sequence Front/Back Sequence Forward/Reverse/Random Container
std::list: Sequence Front/Back Sequence Forward/Reverse Container
std::set: Sorted/Simple/Unique Associative Container Forward Container
std::map: Sorted/Pair/Unique Associative Container Forward Container
std::multiset: Sorted/Simple/Multiple Associative Container Forward Container
std::multimap: Sorted/Pair/Multiple Associative Container Forward Container
Container Guarantees:
=====================
Simp
or
For Rev Rand Front Back Assoc Sort Mult
Cont: Cont: Cont Cont: Sequ: Sequ: Sequ: Cont: Cont: Cont:
Copy Const: O(n)
Fill Const: O(n)
begin() O(1)
end() O(1)
rbegin() O(1)
rend() O(1)
front() O(1)
push_front() O(1)
pop_front() O(1)
push_back() O(1)
pop_back() O(1)
Insert() O(ln(n))
Insert: fill O(n)
Insert: range O(n) O(kln(n) n)
size() O(1)
swap() O(1)
erase key O(ln(n))
erase element O(1)
erase range O(ln(n) S)
count() O(log(n) k)
find() O(ln(n))
equal range O(ln(n))
Lower Bound/Upper Bound O(ln(n))
Equality O(n)
InEquality O(n)
Element Access O(1)
Комментарии:
1. Начните здесь: Спецификации сложности STL . Затем ознакомьтесь со всеми типами контейнеров на этом сайте и посмотрите на заявленные требования к сложности. Надеюсь, это поможет!
2. Могу я получить копию вашей работы для изучения в моем классе ?
3. @nXqd: смотри www.sgi.com/tech/stl
4. @MartinYork, Эта ссылка теперь мертва.
5. john-ahlgren.blogspot.com/2013/10/… Просто взгляните сюда 🙂
Ответ №1:
Я нашел хорошие стандартные контейнеры ресурсов C . Вероятно, это то, что вы все ищете.
вектор
Конструкторы
vector<T> v; Make an empty vector. O(1)
vector<T> v(n); Make a vector with N elements. O(n)
vector<T> v(n, value); Make a vector with N elements, initialized to value. O(n)
vector<T> v(begin, end); Make a vector and copy the elements from begin to end. O(n)
Средства доступа
v[i] Return (or set) the I'th element. O(1)
v.at(i) Return (or set) the I'th element, with bounds checking. O(1)
v.size() Return current number of elements. O(1)
v.empty() Return true if vector is empty. O(1)
v.begin() Return random access iterator to start. O(1)
v.end() Return random access iterator to end. O(1)
v.front() Return the first element. O(1)
v.back() Return the last element. O(1)
v.capacity() Return maximum number of elements. O(1)
Модификаторы
v.push_back(value) Add value to end. O(1) (amortized)
v.insert(iterator, value) Insert value at the position indexed by iterator. O(n)
v.pop_back() Remove value from end. O(1)
v.assign(begin, end) Clear the container and copy in the elements from begin to end. O(n)
v.erase(iterator) Erase value indexed by iterator. O(n)
v.erase(begin, end) Erase the elements from begin to end. O(n)
Для других контейнеров обратитесь к этой странице.
Ответ №2:
Я не знаю ничего похожего на единую таблицу, которая позволяет сравнить их все с одного взгляда (я не уверен, что такая таблица вообще была бы осуществима).
Конечно, в документе стандарта ISO подробно перечислены требования к сложности, иногда в различных довольно удобочитаемых таблицах, в других случаях в менее удобочитаемых пунктах для каждого конкретного метода.
Также ссылка на библиотеку STL по адресу http://www.cplusplus.com/reference/stl/ при необходимости предоставляет требования к сложности.
Комментарии:
1. Информация по адресу cplusplus.com является устаревшим (и иногда ошибочным). Пожалуйста, направляйте людей на en.cppreference.com/w/cpp/container вместо этого. Каждый метод каждого контейнера имеет свою обязательную сложность.