STL Predicate用于std :: list指针的排序算法

时间:2012-02-03 00:02:48

标签: c++ templates stl

我不太了解Predicate如何运作,那么我的问题可能是愚蠢或糟糕的。

我写了这堂课:

namespace Ableton {

    struct DeferencedEqual{

        DeferencedEqual(const Marker* compare_to) : compare_to_(compare_to) { }

        bool operator()(Marker* c1) const {return  *c1 == *compare_to_;}  

        private:
            const Marker* compare_to_;
    };

    struct DeferencedCompare{

        bool operator()(Marker* const* p1, Marker* const* p2){return p1<p2;}

    };


class MarkerContainer {

private:
    std::list<Marker*> list;
    double end_t;
    inline bool exists(std::list<Marker*> *input_list, Marker* check);
   // inline int computeInterval(double to_convert, bool beat_t=true);

public:
    MarkerContainer();
    MarkerContainer(double end_time);
    bool addMarker(Marker* input);
    double computeBeatTime(double sample_t);
    double computeSampleTime(double beat_t);    
    void printAll();
    void sort();

};



}

这是我的.cpp类实现(只是我感兴趣的部分):

namespace Ableton {

void MarkerContainer::sort(){

   std::sort(list.begin(), list.end(),DeferencedCompare());
}
}

我遇到了这个编译错误:

/ usr / include / c ++ / 4.2.1 / bits / stl_algo.h:2867:22:{2867:15-2867:21} {2867:24-2867:31}:错误:操作数无效到二进制表达式(&#39; std :: _ List_iterator&#39;和#std :: _ List_iterator&#39;)[2]

关于?

的任何想法

提前致谢。

编辑一个

嗨,我现在按照你的建议我还有另一个问题。

namespace Ableton {

    struct DeferencedEqual{

        DeferencedEqual(const Marker* compare_to) : compare_to_(compare_to) { }

        bool operator()(Marker* c1) const {return  *c1 == *compare_to_;}  

        private:
            const Marker* compare_to_;
    };




    bool compare(Marker* const p1, Marker* const p2){return p1<p2;}










class MarkerContainer {

private:
    std::list<Marker*> list;
    double end_t;
    inline bool exists(std::list<Marker*> *input_list, Marker* check);
   // inline int computeInterval(double to_convert, bool beat_t=true);

public:
    MarkerContainer();
    MarkerContainer(double end_time);
    bool addMarker(Marker* input);
    double computeBeatTime(double sample_t);
    double computeSampleTime(double beat_t);    
    void printAll();
    void sort();

};



}

现在功能排序:

 namespace Ableton {

    void MarkerContainer::sort(){

       list.sort(compare);
    }

    }

我的main.cpp是:

include "Marker.h"
include "MarkerContainer.h"
include <iostream>
include <list>
include <string>
include <cctype>

using namespace std;

int main (int argc, const char * argv[])
{

    Ableton::MarkerContainer::MarkerContainer container =  Ableton::MarkerContainer::MarkerContainer(10.0);
    Ableton::Marker::Marker* one = new Ableton::Marker::Marker(1.0, 1.0);
    Ableton::Marker::Marker* two = new Ableton::Marker::Marker(2.0, 1.0);
    Ableton::Marker::Marker* three = new Ableton::Marker::Marker(3.0, 1.0);

    if(!container.addMarker(one))
        cout << *one << "NOT Added" << endl;
    if(!container.addMarker(two))
        cout << *two << "NOT Added" << endl;
    if(!container.addMarker(three))
        cout << *three << "NOT Added" << endl;
    cout << "-- LIST " << endl;

    container.printAll();

    cout << "-- LIST after sort" << endl;
    //container.printAll();

}

现在我抓住了这个ld错误,对我来说听起来很奇怪...在C ++中没办法对我? : - )

ld:复制符号Ableton :: compare(Ableton :: Marker *,Ableton :: Marker *)在/..../MarkerContainer.o和/..../main.o中用于架构x86_64 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用) Command / Developer / usr / bin / clang ++以退出代码1

失败

再次感谢您,您是否可以向我推荐一些关于STL及其工作方式的书籍#34;地下&#34;,以便更好地了解这些案例中发生的技术问题

pedr0

2 个答案:

答案 0 :(得分:3)

当然:您无法使用std::sort()std::list<T>进行排序,因为std::sort()需要随机访问迭代器。但是,std::list<T>仅支持bidrectional迭代器。但是,您可以使用std::list<T>::sort()

答案 1 :(得分:2)

除了Dietmar指出的迭代器要求之外,sort还将为您的DeferencedCompare提供列表元素。这些元素的类型为Marker*,而您的比较函数接受Marker* const* p1类型的参数。

从名字来看,我猜你可能想写这个:

bool operator()(const Marker *p1, const Marker *p2){return *p1<*p2;}

顺便说一下,对于Marker类型的对象m1和m2定义了m1 < m2