Почему `std :: forward_list :: insert_after` не возвращает первый элемент, вставленный как другие контейнеры последовательности?

Почему std::forward_list::insert_after не возвращает вставленный элемент первый как другой контейнеры последовательности, такие как list и vector. Есть ли умышленные причины?

c++
7 голосов | спросил Zhe Chen 1 TueEurope/Moscow2015-12-01T18:21:50+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 18:21:50 +0300 2015, 18:21:50

3 ответа


0

forward_list очень отличается от других последовательностей, так же как и insert_after. Чтобы вернуть первый вставленный элемент, ему потребуется дополнительное время и пространство для сохранения этого элемента, в то время как элемент последний будет доступен как часть алгоритма вставки. Кроме того, возврат итератора к первому элементу, вставленному из диапазона, даст вам итератор, который можно использовать для вставки в середину только что добавленного диапазона, а итератор в конец диапазона позволяет добавлять дополнительные данные. .

ответил Mark B 1 TueEurope/Moscow2015-12-01T18:27:53+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 18:27:53 +0300 2015, 18:27:53
0

Я не знаю аргументацию комитета, но вот моя:

Вы можете вставить несколько элементов, например, «диапазон». См. http://en.cppreference.com/w/cpp/container/forward_list/insert_after

Возврат первого элемента не очень полезен, поскольку переход к первому элементу тривиален - у вас уже есть итератор, после которого он был вставлен.

OTOH, переход к последнему вставленному элементу может быть дорогостоящим, если вы вставили много узлов.

ответил Karoly Horvath 1 TueEurope/Moscow2015-12-01T18:27:46+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 18:27:46 +0300 2015, 18:27:46
0

Подумав некоторое время, вот мое понимание.

1. Контейнеры с нормальной последовательностью

Для контейнеров с нормальной последовательностью insert получает итератор (который я назову itl) в качестве параметра и вставляет элементы перед itl. Затем возвращает итератор (itf), который указывает на первый вставленный элемент. Теперь у вас есть 2 итератора, отдельно обозначающих диапазон (первый и внешний) вставленных элементов.

elem-elem-inserted-inserted-inserted-elem-elem
             |                        |
           (itf)                    (itl)

Однако операция insert может сделать недействительной itl, поэтому нам нужно рассмотреть следующие две ситуации:

1.1 Связанная структура

Для связанной структуры itl остается в силе. Поэтому (itf, itl) формируется допустимый диапазон для вставленных элементов.

1.2 Непрерывная структура

Для смежной структуры itl становятся недействительными после вставки. Однако такие структуры обычно поддерживают произвольный доступ, поэтому все еще относительно легко получить itl с помощью простой арифметики над itf. С другой стороны, возврат итератора к первому вставленному элементу сохраняет согласованность.

2. Прогнозный список

insert_after для forward-list получает итератор (itf) в качестве параметра и вставляет элементы после него. Затем он возвращает итератор последнего вставленного элемента (itl). Поскольку itf остается в силе, у нас снова аналогичный диапазон.

elem-elem-inserted-inserted-inserted-elem-elem
      |                        |
    (itf)                    (itl)

3. Заключение

Независимо от того, возвращает ли операция insert итератор к первому вставленному элементу или к последнему вставленному элементу, она всегда пытается предоставить доступ к началу и концу вставленных элементов одновременно, что обеспечивает максимальную гибкость.

ответил Zhe Chen 2 WedEurope/Moscow2015-12-02T09:29:41+03:00Europe/Moscow12bEurope/MoscowWed, 02 Dec 2015 09:29:41 +0300 2015, 09:29:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132