Как может выглядеть определение операции позиционного доступа † на контейнере, мне кажется довольно простым, когда дело доходит до std::vector
, std::deque
, std::list
и std::forward_list
. То есть доступ к элементу k th в коллекции состоит из получения элемента, хранящегося в положении k th в коллекции X .
Например, выражение vec[k-1]
обращается к k
th в std::vector
, тогда как *std::next(lst.begin(), k-1)
соответствует его std::list
аналогу.
Однако, когда дело доходит до ассоциативных контейнеров , таких как std::set
или std::unordered_set
, мне не очень понятно, имеет ли смысл говорить о позиционных операциях доступа на самом деле, так как Я не нахожу простой способ определить местоположение произвольной позиции k th в таких контейнерах.
Тем не менее, мы можем продолжить, как в примере std::list
, показанном выше, то есть перенести итератор в «первый» элемент ассоциативного контейнера (например, итератор, возвращаемый функцией-членом begin()
) и затем переместите итератор вперед k-1 раз (например, с помощью std::next()
).
Я заметил, что контейнеры std::vector
, std::deque
, std::list
и std::forward_list
все реализованы с использованием линейных структур данных, тогда как std::set
, который обычно реализуется как бинарное дерево, нет. Таким образом, возможно, эта проблема связана с линейностью базовых структур данных, которые реализуют контейнеры.
Есть ли способ четко определить семантику позиционной операции доступа для ассоциативного контейнера? Или такие операции доступа не применимы к ним?
† Не путайте поиск и доступ операции. В операции поиска вы ищете элемент с данным ключом в коллекции.
X Это независимо от времени работы, которое требуется для этого (например, линейное для std::list
вместо постоянного времени для std::vector
) или от того, не существует выделенной функции-члена ( например, отсутствие оператора индекса в std::list
) для достижения этого.