【发布时间】:2020-02-09 10:30:42
【问题描述】:
我有一个自定义的双向链表类,我想为它实现迭代器,这样我就可以使用像 std::sort 这样的函数和下面提供的函数。有什么办法呢?
例如,现在我有了实现,但它很糟糕。以下字符串
std::cout << list.end() - list.begin() << std::endl;
输出
-179191768
其中 list 是我的列表类,其中包含 10 个元素。
我要工作的功能:
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()需要随机访问迭代器,这与链表不太一致。为什么标准的std::list有自己的排序方法(可能使用归并排序) -
那么在列表排序算法中使用索引会更好吗?
-
最好使用使用前向或双向元素访问的算法,如归并排序。
-
由于同样的原因,在链表上建立索引效果不佳。
标签: c++ linked-list iterator