Скорость цикла begin() end() STL контейнеров

239
15 декабря 2016, 16:06

Есть где-нибудь таблица или информация об этом?

Не могу что-то найти, нужно точно знать, будет ли сложность N, log N, C и т.д. для цикла прохода:

for(auto IT = cont.begin(); IT != cont.end(); IT++){}
List
Deque
Vector
set
multiset
map
multimap
stack
queue
priority_queue
slist

Вот примерно как тут: https://www.unetti.com/blog/wp-content/uploads/2013/03/Screen-Shot-2013-03-21-at-11.31.09-AM.png

Answer 1

Быстрее, чем за O(N) никак не получится. Никак. В любом случае нужно перебирать все элементы. Поэтому конечная сложность будет O(N) * (сложность инкремента итератора).

Обсудим сложность инкремента итератора.

stack, queue, priority_queue - для этих контейнеров нет смысла обсуждать сложность - у них нет нужного итератора.

vector - тут все просто. так как вектор храниться единым массивом, то процедура инкремента итератора - это просто приплюсовать число.

list - обычно реализовывается как цепочка с блоков, которые указывают на следующий. Поэтому в прямом направлении проход быстрый (это просто взятие указателя, чуточку медленнее, чем приплюсовать число, так как нужно читать с памяти). Сложность инкремента итератора - константная.

deque - может быть реализовано на базе vector или list. Соответственно, на это и нужно ориентироваться.

slist - в стандартной библиотеке такого класса нет. Но обычно он реализуется либо на базе вектора, либо списка. Поэтому, скорее всего сложность инкремента итератора будет константной.

set, multiset, map, multimap - с этими типами нужно копать глубже в конкретную реализацию конкретного компилятора. Тут я написал простенький код, который просто считал время итерирования и делил на общее кол-во элементов. (я тестил на gcc version 4.9.2 20141101 (Red Hat 4.9.2-1) (GCC), fedora 21). У меня получилось, что время инкрементирования итератора приблизительно константно.

Итого, для stack, queue, priority_queue указанный в вопросе цикл не работает (у них нет подходящих итераторов), для slist нужно смотреть в конкретную реализацию. Для всех остальных сложность, как не удивительно O(N).

READ ALSO
Как определить текущий язык (не локаль!) Windows 7?

Как определить текущий язык (не локаль!) Windows 7?

Интересует метод определения локализации Windows 7 на с++(не локали, а именно языка интерфейса), например "Пуск" в русской версии, "Start" - в английской

499
Сигнал  для редактирования БД, QTableView\QSqlRelationalTableModel

Сигнал для редактирования БД, QTableView\QSqlRelationalTableModel

Подскажите подходящий сигнал для редактирования БДНеобходимо сразу после редактирования пользователем ячейки таблицы послать запрос в БД об изменении...

296
Не удаляется объект из памяти

Не удаляется объект из памяти

Вспоминаю C++, используя Qt

234