c++ - 用于 std::list 指针排序算法的 STL 谓词

标签 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}:错误:操作数无效到二进制表达式('std::_List_iterator' 和 'std::_List_iterator')[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 for architecture x86_64 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) 命令/Developer/usr/bin/clang++ 失败,退出代码为 1

再次感谢,您能否推荐一些关于 STL 及其“地下”工作原理的书籍,以便从技术上更好地理解这些案例中发生的事情

pedr0

最佳答案

当然:你不能使用 std::sort()std::list<T> 进行排序因为std::sort()需要随机访问迭代器。然而,std::list<T>仅支持双向迭代器。您可以使用 std::list<T>::sort() , 然而。

关于c++ - 用于 std::list 指针排序算法的 STL 谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121901/

相关文章:

c++ - 将二进制数据转换为可打印的十六进制

c++ - STL <set> 搜索

c++ - std::partition 分隔小于 pivot 的元素的问题

c++ - 为什么它重复5次?

ruby-on-rails - 部分在 rails 中具有多个产量

c++ - 具有自身无序集合的类

templates - 如何在 Go html/template 中获取 map 元素的结构字段?

c++ - 迭代标准容器中的所有元素对(C++)

c++ - std::unordered_set的迭代顺序

c++ - 不能在 lua 脚本中要求 luacom 库