17

可能重复:
使用 stl 排序函数对列表进行排序
为什么只有 std::list::sort()?

我的问题是我们可以使用 std::sort 函数对两个 std::lists 进行排序吗?我有 2 个字符串列表

  std::list<std::string>list1, list2;
  .....//entering values to list
  std::sort(list1.begin(), list1.end());

  std::sort(list2.begin(), list2.end());

当我对这些列表进行排序时,我遇到了错误。我尝试使用 std::vector,此时排序有效。

错误就像

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(1158) :请参阅 'std::operator -' 1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC 的声明\include\algorithm(3642): error C2784: '_Base1::difference_type std::operator - (const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : 不能用 1> [ 1> _Mylist=std::_List_val> 1> 从 'std::_List_iterator<_Mylist>' 1> 推导出 'const std::_Revranit<_RanIt,_Base> &' 的模板参数

我必须知道只有 std::sort 支持列表?

4

2 回答 2

53

您不能使用std::sortto sort std::list,因为std::sort要求迭代器是随机访问的,并且std::list迭代器只是双向的。

但是,std::list有一个成员函数sort可以对其进行排序:

list.sort();
// if you want to use a comparator different from the default one:
// list.sort(comparator);
于 2012-05-18T12:30:27.817 回答
12

您应该使用list::sort,它可能使用不同的算法。std::sort需要随机访问迭代器(支持任意大小的跳转),而列表迭代器一次只能向前或向后移动一个链接。

参见 C++11 25.4.1.1:

template<class RandomAccessIterator> void sort(RandomAccessIterator first, 
         RandomAccessIterator last);

和 23.3.5.5/27(成员std::list):

void sort();
template <class Compare> void sort(Compare comp);
于 2012-05-18T12:30:26.293 回答