@BenjaminLindley прав, указывая на то, что T& operator[](std::size_t)
не имеет смысла для контейнеров без итераторов произвольного доступа, поскольку все циклы произвольного доступа будет иметь O(N^2)
сложности (линейные во внешнем контуре над элементами, раз линейными в std::advance
на итераторы). По этой причине из-за последовательности контейнеров, только std::array
, std::vector
и std::deque
обеспечивают operator[]
, но std::list
(двунаправленные итераторы) и std::forward_list
(вперед итераторы) не делают.
Упорядоченные ассоциативные контейнеры (std::set
, std::map
, и их кузены многоканальных) только обеспечивают двунаправленные итераторы, а Неотсортированных Ассоциативные контейнеры (std::unordered_set
, std::unorderd_map
и их кузены мульти) имеют по крайней мере вперед итераторы. У них также нет operator[](std::size_t)
в качестве участника. Поэтому вам необходимо написать std::advance(my_set.begin(), n)
вместо my_set[n]
, что делает сложность такого звонка болезненным помутнением O(N)
.
Как добавленное примечание: контейнеры, подобные карте, содержат пары «ключ-значение», а ассоциативный характер этих контейнеров выражается через другой operator[]
, но не индексируется по смещению, а скорее с «ассоциированным» ключом, и они имеют подпись Value& operator[](Key const&)
(и переназначение rvalue-reference с C++ 11). Эти операторы имеют O(log N)
сложность для std::map
и амортизированы O(1)
сложность для std::unordered_map
. Это даст, например, петли над всеми ключами этих контейнеров O(N log N)
и O(N)
сложности, соответственно.
ассоциативной operator[]
версия также имеет вставки семантики: вызовы, как my_map[my_key] = my_value;
будут пытаться вставить пару my_key, my_value
в карту, и возвращают итератор, если уже существует такой элемент. Обратите внимание, что это также не const
перегрузки для доступа к ассоциативным элементам тезисов: используйте для этого функции-члены find()
.
Для std::set
перегруженного operator[](Key const&)
не имеет никакого смысла, так как это было бы только выразить тот факт, что ключ, связанные с собой, и вставной семантикой уже более непосредственно выражаются через функцию insert()
члена.
Насколько я знаю, STL 'set' не имеет' operator [] '. Вы уверены, что первый пример кода компилируется? – templatetypedef
@templatetypedef он не компилировал – 2013-04-12 19:11:00