在我看来,我知道链接列表应该是可能的,但我没有找到任何答案,所以我在这里问。
给出同一列表中项目的两个迭代器。我想把迭代器“frm”指向的项,并在迭代器“to”指向项之前将其“插入”列表。
似乎所需要的只是更改列表中指向“frm”(删除“frm”)的项上的指针,然后更改指向“to”的项目上的指针,以便它引用“frm”然后改变“frm”节点上的指针指向“to”。
我到处寻找这个并找不到答案。
注意我不能使用splice,因为我无法访问列表中只有列表中项目的迭代器。
template <typename T>
void move(typename std::list<T>::iterator frm, typename std::list<T>::iterator to) {
//remove the item from the list at frm
//insert the item at frm before the item at to
}
答案 0 :(得分:1)
迭代器包含指向一段数据所需的最少信息,您缺少的是链接列表还包含其他簿记的事实,因此基本上list
类看起来像以下
template <typename Type>
class list {
int size; // for O(1) size()
Type* head;
Type* tail;
class Iterator {
Type* element;
// no back pointer to list<Type>*
};
...
};
要从列表中删除元素,您还需要更新这些数据成员。要做到这一点,迭代器必须包含一个指向列表本身的后向指针,根据为大多数迭代器提供的接口,这不是必需的。另请注意,STL中的算法实际上并不会修改操作容器的簿记,只能交换元素和重新排列。
我建议您查看<algorithm>
标头以及std::back_inserter
和std::move_iterator
等设施,以了解如何包装迭代器以实际修改容器代表。
答案 1 :(得分:1)
这个实现是实现定义的,但是c ++标准允许使用iter_swap虽然它没有完全做到这一点。这可能是优化的,以交换链表中保存的值上的指针,类似于我所描述的有效地重新排序列表中的项目而不需要完全交换。