std :: list,仅使用迭代器移动列表中的项目

时间:2017-05-29 14:21:45

标签: c++ list linked-list iterator std

在我看来,我知道链接列表应该是可能的,但我没有找到任何答案,所以我在这里问。

给出同一列表中项目的两个迭代器。我想把迭代器“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
}

2 个答案:

答案 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_inserterstd::move_iterator等设施,以了解如何包装迭代器以实际修改容器代表。

答案 1 :(得分:1)

这个实现是实现定义的,但是c ++标准允许使用iter_swap虽然它没有完全做到这一点。这可能是优化的,以交换链表中保存的值上的指针,类似于我所描述的有效地重新排序列表中的项目而不需要完全交换。

iter_swap() versus swap() -- what's the difference?