#include <iostream>
#include <list>
#include <algorithm>
int main()
{
std::list<int> numbers = {1, 3, 0, -8, 5, 3, 1};
auto positionInMiddle = std::find(numbers.begin(), numbers.end(), -8);
std::sort(positionInMiddle, numbers.end()); // This doesn't work,
// Needs random access iterator.
numbers.sort(); // This sorts the entire list.
for (int i : numbers)
std::cout << i << std::endl;
return 0;
}
我可以使用一些技巧吗?例如,如果有一个方法在列表中交换两个节点,那么我可以使用mergesort。
答案 0 :(得分:4)
列表具有恒定的时间插入和删除,因此使用splice
进行排序的临时列表非常快速插入(不幸的是,在复制元素中仍然是线性的):
#include <iostream>
#include <list>
#include <algorithm>
int main()
{
std::list<int> numbers = {1, 3, 0, -8, 5, 3, 1};
auto positionInMiddle = std::find(numbers.begin(), numbers.end(), -8);
std::list<int> temp;
temp.splice(temp.end(), numbers, positionInMiddle, numbers.end());
temp.sort();
numbers.splice(numbers.end(), temp, temp.begin(), temp.end());
for (int i : numbers)
std::cout << i << std::endl;
return 0;
}
答案 1 :(得分:-2)
你不能使用std :: sort来对std :: list进行排序,因为std :: sort要求迭代器是随机访问的,而std :: list迭代器只是双向的。
但是,std :: list有一个成员函数排序,它将对它进行排序: