Std:list.sort(),二元谓词

std::list.sort(), binary predicate?

本文关键字:二元 谓词 sort Std list      更新时间:2023-10-16

我有一个列表容器类(不是std::list),可以存储任何类型。我想在这个容器中储存很多std::listS不同类型(list<int>list<string>等)。

我可以使用一个通用的二进制谓词,当我排序他们?

伪代码:

template <typename T>
bool compare(const T& input1, const T& input2)
{
    return input1>input2;
}
for(auto i = myList.begin(); i!=myList.end(); ++i) //i is an iterator to a std::list
{
    (*i).sort(compare<decltype(*i)::value_type>);
    //when dereferencing i I get a
    //std::list
}

这是有效的(我不确定我是否可以使用decltype这种方式)?

问题是我甚至不能得到这个简单的例子编译:

#include <iostream>
#include <list>
using namespace std;
template <typename T>
void display(const T& input)
{
    for(auto i = input.cbegin(); i!=input.cend(); ++i)
        cout << *i << ' ';
    cout << endl;
    return;
}
template <typename R>
class SomeFunc
{
public:
    bool operator ()(const R& in1, const R& in2)
    {
        return in1>in2;
    }
};
template <typename R>
bool someFunc(const R& in1, const R& in2)
{
    return in1<in2;
}

int main()
{
    list<int> myList;
    myList.push_back(5);
    myList.push_back(137);
    myList.push_back(-77);
    display(myList);
    myList.sort(SomeFunc<decltype(myList)::value_type>());
    display(myList);
    myList.sort(someFunc<decltype(myList)::value_type>);
    display(myList);
    cin.ignore();
    return 0;
};

更正:它确实在这里编译:http://ideone.com/ZMcjSJ但不是在我的VS2012上…我开始讨厌vs了,谁能解释一下为什么它不能在VS2012上编译?我显然在VS2012中有decltype命令,但我想它不像c++ 11 dectype那样工作?http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx

我在CodeBlocks中使用gnu gcc设置为c++ 11 -工作正常

是的,方法std::list<T>::sort()有一个接受比较函子的重载:

template <typename T>
struct MyComparator
{
    bool operator() const (const T& input1, const T& input2)
    {
        return input1 > input2;
    }
};
...
myList.sort(MyComparator<T>());