17

重複の可能性:
stl sort 関数を使用してリストをソートするの
はなぜ std::list::sort() だけなのでしょうか?

私の質問は、std::sort 関数を使用して 2 つの 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): エラー C2784: '_Base1::difference_type std::operator - (const std::_Revrinit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)': できませんでした'std::_List_iterator<_Mylist>' から 'const std::_Revrinit<_RanIt,_Base> &' のテンプレート引数を 1> [ 1> _Mylist=std::_List_val> 1> ] で推定します。

std::sort のみがリストをサポートしていることを知っておく必要がありますか?

4

2 に答える 2

53

イテレータはランダムアクセスである必要があり、イテレータは双方向のみであるため、std::sortsortには使用できません。std::liststd::sortstd::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ランダムアクセス反復子 (任意のサイズのジャンプをサポート) が必要ですが、リスト反復子は一度に 1 つのリンクだけ前後に移動できます。

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 に答える