如何对std :: list的一部分进行排序?

时间:2013-08-06 08:01:19

标签: c++ algorithm c++11

#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。

2 个答案:

答案 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有一个成员函数排序,它将对它进行排序: