Які гарантії складності стандартних контейнерів?


160

Мабуть ;-) стандартні контейнери дають певну форму гарантій.

Який тип гарантій і чим саме відрізняються різні типи контейнерів?

Працюючи зі сторінки 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(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

Я знайшов хороший ресурс Standard C ++ Containers . Напевно, це те, що ви все шукаєте.

ВЕКТОР

Конструктори

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)

Інші контейнери див. На цій сторінці.


6

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

Звичайно, стандартний документ ISO детально перераховує вимоги щодо складності, іноді в різних досить читабельних таблицях, інший раз у менш читаних пунктах для кожного конкретного методу.

Також посилання на бібліотеку STL за адресою http://www.cplusplus.com/reference/stl/ надає вимоги щодо складності, де це доречно.


0

Ще одна таблиця швидкого пошуку доступна на цій сторінці github

Примітка. Це враховує не всі контейнери, такі як, unorряд_map тощо, але все ще чудово подивитися. Це просто чистіша версія цього

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.