繁体   English   中英

如何实现双向链表的迭代器?

[英]How to implement iterator for doubly linked list?

我有一个自定义的双向链表 class 并且我想为它实现迭代器,以便我可以使用 std::sort 之类的函数和下面提供的函数。 可以做些什么呢?

例如,现在我有了实现,但它很糟糕。 下面的字符串

std::cout << list.end() - list.begin() << std::endl;

输出

-179191768

其中 list 是我的列表 class ,其中包含 10 个元素。

我想工作的function:

template <typename I, typename C>
void quickSort(I begin, I end, C cmp) {
    if (begin >= end) throw new exception_incorrectSelection;
    I i = begin, j = end;
    T pivot = *(i + (j - i) / 2);
    while (i <= j) {
        while (cmp(*i, pivot)) ++i;
        while (cmp(pivot, *j)) --j;
        if (i <= j) {
            std::iter_swap(i, j);
            ++i;
            --j;
        }
    }
    if (j > begin) quickSort(begin, j, cmp);
    if (i < end) quickSort(i, end, cmp);
}

由于前面表达的原因,它在异常检查时中断。

迭代器有各种类别。 对于双向链表,您通常会实现双向迭代器。 双向迭代器不支持std::sort ,但会支持许多(大多数?)其他算法,例如findfind_ifaccumulate等。

可以为支持 RandomAccessIterator 概念的双向链表编写迭代器(例如,支持的iterator + intiterator - int ),但您是否真的想要这样做是有疑问的——您通常期望随机访问迭代器提供恒定的时间加法和减法,但使用链表,它们将是线性时间。 因此,即使您在需要支持的操作方面支持该概念,您也违反了对复杂性的要求:

RandomAccessIterator概念增加了对使用 +=、+、-= 和 - 的恒定时间推进的支持,以及使用 - 计算恒定时间距离的支持。 随机访问迭代器还通过下标支持数组表示法。

[重点补充]

因此,尽管您可以根据需要使其与std::sort一起使用,但这样做可能不是一个好主意。

这留下了两个选择:go 提前并产生相同的接口,并接受随机访问操作将具有线性复杂性的事实,或者重写您的算法以使用双向迭代器可以提供的功能。 看起来像这样:

template <typename I, typename C>
void quickSort(I begin, I end, C cmp) {
    if (begin >= end) throw new exception_incorrectSelection;
    I i = begin, j = end;
    T pivot = *(i + std::distance(i, j) / 2); // <--
    while (i <= j) {
        while (cmp(*i, pivot)) ++i;
        while (cmp(pivot, *j)) --j;
        if (i <= j) {
            std::iter_swap(i, j);
            ++i;
            --j;
        }
    }
    if (j > begin) quickSort(begin, j, cmp);
    if (i < end) quickSort(i, end, cmp);
}

至少像通常实现的那样, std::distance会做这样的事情:

template <class Iter>
size_t distance(Iter a, Iter b) { 
    size_t ret = 0;

    while (a != b) {
       ++a;
       ++ret;
    }
    return ret;
}

...因此,只要您的迭代器支持++!= ,通常就足以使其与std::distance一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM