[英]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
,但会支持许多(大多数?)其他算法,例如find
、 find_if
、 accumulate
等。
您可以为支持 RandomAccessIterator 概念的双向链表编写迭代器(例如,支持的iterator + int
和iterator - 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.