在模板类 (C++) 中使用排序

Using sort within template class (C++)

本文关键字:排序 C++      更新时间:2023-10-16

我想使用标准算法对我的列表进行排序 std::sort .

这是我的尝试:

#include <list>
#include <algorithm>
template<typename T>
class MyList {
private:
    std::list<T> myList;        
public:
    void add(T item) {
        myList.push_back(item);
    }
    void mySort() {
        std::sort(myList.begin(), myList.end());
    }
};

编译错误:

    c:mingwlibgccmingw324.8.1includec++bitsstl_algo.h:5475:22: note: candidates are:
In file included from c:mingwlibgccmingw324.8.1includec++bitsstl_algobase.h:67:0,
                 from c:mingwlibgccmingw324.8.1includec++bitschar_traits.h:39,
                 from c:mingwlibgccmingw324.8.1includec++ios:40,
                 from c:mingwlibgccmingw324.8.1includec++ostream:38,
                 from c:mingwlibgccmingw324.8.1includec++iostream:39,
                 from ..srcfirstone.cpp:1:
c:mingwlibgccmingw324.8.1includec++bitsstl_iterator.h:327:5: note: template<class _Iterator> typename std::reverse_iterator<_Iterator>::difference_type std::operator-(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)
     operator-(const reverse_iterator<_Iterator>& __x,
     ^
c:mingwlibgccmingw324.8.1includec++bitsstl_iterator.h:327:5: note:   template argument deduction/substitution failed:
In file included from c:mingwlibgccmingw324.8.1includec++algorithm:62:0,
                 from ..srcmylist.h:5,
                 from ..srcfirstone.cpp:2:
c:mingwlibgccmingw324.8.1includec++bitsstl_algo.h:5475:22: note:   'std::_List_iterator<int>' is not derived from 'const std::reverse_iterator<_Iterator>'
     std::__lg(__last - __first) * 2);
                      ^
In file included from c:mingwlibgccmingw324.8.1includec++bitsstl_algobase.h:67:0,
                 from c:mingwlibgccmingw324.8.1includec++bitschar_traits.h:39,
                 from c:mingwlibgccmingw324.8.1includec++ios:40,
                 from c:mingwlibgccmingw324.8.1includec++ostream:38,
                 from c:mingwlibgccmingw324.8.1includec++iostream:39,
                 from ..srcfirstone.cpp:1:
c:mingwlibgccmingw324.8.1includec++bitsstl_iterator.h:384:5: note: template<class _IteratorL, class _IteratorR> typename std::reverse_iterator<_Iterator>::difference_type std::operator-(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&)
     operator-(const reverse_iterator<_IteratorL>& __x,
     ^
c:mingwlibgccmingw324.8.1includec++bitsstl_iterator.h:384:5: note:   template argument deduction/substitution failed:
In file included from c:mingwlibgccmingw324.8.1includec++algorithm:62:0,
                 from ..srcmylist.h:5,
                 from ..srcfirstone.cpp:2:
c:mingwlibgccmingw324.8.1includec++bitsstl_algo.h:5475:22: note:   'std::_List_iterator<int>' is not derived from 'const std::reverse_iterator<_Iterator>'
     std::__lg(__last - __first) * 2);
                      ^
18:57:32 Build Finished (took 986ms)

我做错了什么?

您正在尝试对列表进行排序。列表不支持std::sort工作所需的随机访问迭代器。(列表仅支持双向迭代器。

以我的拙见,这是来自"C++大神"的错误逻辑。

可以使用 list::sort 成员函数对列表进行排序。

标准算法std::sort需要随机访问迭代器,std::list<>::iterators是双向迭代器)

使用成员函数std::list<>::sort对列表进行排序

你基本上有两个选择:要么切换到使用 std::listsort() 成员函数:

myList.sort();

。或者切换到不同的容器类型,例如 vectordeque ,通过提供随机访问迭代器来支持std::sort

在几乎所有可能的情况下,后者都是正确的选择; std::list(在我看来)几乎总是一个错误。

std::list没有

随机访问迭代器,这是std::sort的要求。但您可以改用 std::list::sort 成员函数。

请注意,这首先假设您需要一个std::list。根据我的经验,这在实际代码中很少出现。很可能一个std::vector就足够了。

使用以下代码:

  void mySort() 
  {
    myList.sort();
    //std::sort(myList.begin(), myList.end());
  }