对stl ::抽象数据类型列表进行排序

时间:2014-08-09 10:27:28

标签: c++ list sorting stl

我是否知道如何将stl::list::sort函数与外部函数一起用于抽象数据类型?

构造函数的示例代码如下所示:

ADType::ADType(string name, int object){
//constructor code
}

对于方法:

using <list>
using namespace std;

bool compare_Object(ADType& first, ADType& second){
//search algorithm
return true;
}

int main(){
ADType test1 = ADType("Test 1", 123);
ADType test2 = ADType("Test 3", 142);
ADType test3 = ADType("Test 2", 200);
list<ADType> testlist;
testlist.push_back(test1);
testlist.push_back(test2);
testlist.push_back(test3);
testlist.sort(compare_Object);
//code to print out objects in list
}

上面的行给了我函数调用缺失参数列表的错误C3867和没有参数的函数的C2660。我刚刚发布的代码有什么问题吗?

2 个答案:

答案 0 :(得分:1)

您的示例代码存在一些问题(不完整,可能切片,不是const正确),并且没有显示任何多态性。

在C ++ 11中,您可以这样做:

#include <iostream>
#include <memory>
#include <list>

struct A {
    virtual ~A() {}
    virtual void print() const { std::cout << "A\n"; }
};

struct B : A {
    virtual void print() const { std::cout << "B\n"; }
};


inline bool operator < (const A& a, const A& b) {
    return dynamic_cast<const A*>(&a) && dynamic_cast<const B*>(&b);
}

template <typename T>
inline bool less_unique_ptr(const std::unique_ptr<A>& a, const std::unique_ptr<A>& b) {
    return *a < *b;
}

int main (int argc, char *argv[])
{
    std::list<std::unique_ptr<A>> ptr_list;
    ptr_list.emplace_back(new B);
    ptr_list.emplace_back(new B);
    ptr_list.emplace_back(new A);
    ptr_list.sort(less_unique_ptr<A>);

    for(const auto& e : ptr_list)
        e->print();

    return 0;
}

答案 1 :(得分:0)

更简单的修复方法是将compare方法实现为静态方法,因此不需要对象实例来使用该方法。

static bool compare_Object(BaseObj& first, BaseObj& second){
    return first.getLength() > second.getLength();
    // return true give me error since it can't really sort.
}

BaseObj类:

    BaseObj::BaseObj(int a) {
          length = a;
    }

    int BaseObj::getLength() {
          return length;
    }