Каковы гарантии сложности стандартных контейнеров?


160

Видимо ;-) стандартные контейнеры предоставляют некоторую форму гарантий.

Какого рода гарантии и каковы различия между различными типами контейнеров?

Работая со страницы SGISTL ), я придумал это:

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(n)
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)

Начните здесь: Спецификации сложности STL . Затем прочитайте все типы контейнеров на этом сайте и посмотрите на указанные требования к сложности. Надеюсь это поможет!
Крис Джестер-Янг

1
Могу ли я получить копию вашей работы для обучения в моем классе?
Джунг Нгуен

1
@nXqd: см. www.sgi.com/tech/stl
Мартин Йорк,

1
@MartinYork Эта ссылка сейчас мертва.
Чани,

2
john-ahlgren.blogspot.com/2013/10/… Просто посмотрите здесь :)
Shalomi11

Ответы:


72

Я нашел хороший ресурс Стандартные контейнеры 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)

Accessors

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)

Для других контейнеров, обратитесь к странице.


6

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

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

Также ссылка на библиотеку STL по адресу http://www.cplusplus.com/reference/stl/ содержит требования к сложности, где это необходимо.


0

Еще одна таблица быстрого просмотра доступна на этой странице GitHub

Примечание: это не учитывает все контейнеры, такие как, unordered_map и т. Д., Но все равно замечательно. Это просто более чистая версия этого

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.