Вы корректны, который стандарт не говорит что сложность списка:: размер () должен быть - однако, он действительно рекомендует, чтобы он "имел постоянную сложность" (Примечание A в Таблице 65).
Вот интересная статья Howard Hinnant , который объясняет, почему некоторые люди думают список:: размер () должен иметь O (N) сложность (в основном, потому что они полагают что O (1) список:: размер () входит в список:: соединение встык () имеет O (N) сложность), и почему O (1) список:: размер () быть хорошей идеей (по мнению автора):
я думаю, что основные моменты в газете:
list::size()
может быть O (1) причины операция соединения встык для становления линейным size()
(такой как его один пример, где list::size()
назван при содержании блокировки). size()
быть O (N), в интересах 'наименьшего количества удивления', стандарт должен потребовать любого контейнера, который реализует size()
для реализации его в O (1) вид. Если контейнер не может сделать этого, он не должен реализовывать size()
вообще. В этом случае пользователь контейнера будет проинформирован, что size()
недоступно, и если они все еще хотят или должны получить число элементов в контейнере, они могут все еще использовать container::distance( begin(), end())
для получения того значения - но они будут абсолютно знать, что это - O (N) операция. я думаю, что я склонен соглашаться с большей частью его обоснования. Однако мне не нравится его предложенное дополнение к эти splice()
перегрузки. Необходимость передать в n
, который должен быть равен [1 110] для получения корректного поведения, походит на рецепт для трудно для диагностирования ошибок.
я не уверен, что должно или могло быть сделано, продвинувшись, поскольку любое изменение окажет значительное влияние на существующий код. Но как есть, я думаю, что на существующий код уже влияют - поведение могло бы довольно существенно отличаться от одной реализации до другого для чего-то, что должно было быть четко определено. Возможно, комментарий onebyone о кэшировании и маркировке размера, известного/неизвестного, мог бы работать хорошо - Вы амортизируетесь O (1) поведение - единственное время, Вы получаете O (N), поведение состоит в том, когда список изменяется некоторым соединением встык () операции. Хорошая вещь об этом состоит в том, что это может быть сделано конструкторами сегодня без изменения в стандарте (если я не пропускаю что-то).
, Насколько я знаю, C++ 0x ничего не изменяет в этой области.
Используйте символ с разбитой чертой, «¦
», Unicode 00A6 BROKEN BAR. Это может или не может работать для ваших конкретных потребностей, но это хорошее визуальное приближение.