2015-02-06 7 views
4

Есть ли какая-то причина, по которой комитет по стандартам решил реализовать API для std::forward_list, так что он не соответствует требованиям концепции контейнера Sequence?std :: forward_list и требования к концепции последовательности

В Sequence требования концепции указывают, что контейнер должен быть совместим с выражениями типа:

c.insert(it, v); // insert at position 
c.insert(it, n, v); // fill insert 
c.insert(it, begin, end); // insert range 

... где it является итератор, v является элементом, и n является целым числом, и begin/end является итератора.

Нет никакой причины, по которой этот API невозможно с помощью односвязного списка, поскольку для функций insert требуется начальная позиция итератора. Но по какой-то причине std::forward_list имеет функции insert_after, которые нарушают совместимость с концепцией Sequence.

Есть ли причина для этого?

+0

Что именно вы имеете в виду? 'Forward_list' - контейнер последовательности (см. [Sequence.reqmts]/1). – Columbo

+0

@Columbo, требования к последовательности включают функцию 'insert' member – Siler

+0

.. странный. В стандарте многократно упоминается, что 'forward_list' соответствует требованиям контейнера последовательности. Даже на cppreference. – Columbo

ответ

2

Причина заключается в том, что это крайне неэффективно для вставки перед тем элемент в односвязный список: Вы должны начать с самого начала и итерации, пока вы не найти запрашиваемую место для вставки, что делает вставку O(n) вместо постоянной времени ,

Сравните, почему они не предоставляют operator[] в std::list, потому что это займет линейное время. Точно так же, как list не отвечает требованиям случайного доступа по сравнению с vector, forward_list не отвечает всем требованиям последовательности по сравнению с list.

+0

Но 'operator []' не находится в таблице требований контейнера последовательности, тогда как 'a.insert (p, t)' is. – Barry

+0

, но требования 'insert' требуют позиции итератора в любом случае, так что не будет O (N) вставляться после ... Я думаю, комитет счел, что стоило его четко называть функцию insert_after, а не просто называть ее вставкой и отвечают требованиям концепции ... (подумайте над этим, как представляется, требования к концепции требуют, чтобы он вставлялся раньше) – Siler

+1

@Siler Функции вставки означают, чтобы вставить элемент * перед * запрошенным итератором. Как вы это сделаете в одном единственном списке? Или вы измените значение 'insert' только для одного контейнера? –

Смежные вопросы