Я хочу соединить диапазон [first, last]
с обоими конечными точками включительно. У меня есть итераторы к элементу до first
и к last
, Я мог бы сделать это с splice_after()
но только в линейном времени.
Я верю, что это соединение может быть сделано в постоянное время. Как я могу сделать это с std::forward_list
?
Если вопрос не ясен, вот пример кода, показывающего мою проблему:
Код на Live Work Space
#include <algorithm>
#include <forward_list>
#include <iostream>
#include <iterator>
using namespace std;
int main() {
forward_list<char> trg{'a','b','c'};
forward_list<char> src{'1','2','3','4'};
auto before_first = src.begin();
auto last = find(src.begin(), src.end(), '4');
cout << "before_first = " << *before_first << ", last = " << *last << "\n";
// trg.splice(trg.begin(), src, before_first, last); // no such splice
auto end = last;
++end; // Ouch! splice has to find last again although I already had it :(
trg.splice_after(trg.begin(), src, before_first, end);
cout << "Target after splice:\n";
copy(trg.begin(), trg.end(), ostream_iterator<char>(cout," "));
cout << "\nSource after splice:\n";
copy(src.begin(), src.end(), ostream_iterator<char>(cout," "));
cout << endl;
}
Выход:
before_first = 1, last = 4
Target after splice:
a 2 3 4 b c
Source after splice:
1
Спецификация forward_list
говорит, что ассортимент (first, last)
следует соединить, и, к сожалению, за O (1) времени сделать это невозможно, потому что нужен доступ к last-1
сделать это, и единственный способ получить доступ к last-1
это итерация вперед от first
,
Если бы спецификация была сращивать диапазон (first, last]
тогда O (1) сращивание было бы возможно. Я не знаю ни одного способа добиться этого с нынешним forward_list
спекуляция
Я думаю, что это дефект. Однако я уже пытался и не смог это исправить:
http://cplusplus.github.com/LWG/lwg-defects.html#897
Однако в прошлом проблемы были обращены вспять, особенно когда жалобы поступали от не членов комитета, таких как вы. Чтобы подать жалобу, нужно открыть новую проблему, если необходимо, сослаться на любые старые или связанные проблемы. Инструкции по открытию номера Вот.
PS: +1 по вопросу.
Других решений пока нет …