Предикат STL для алгоритма сортировки по указателям на std :: list - PullRequest
0 голосов
/ 03 февраля 2012

Я не очень хорошо понял, как работает 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 :: Сравнить (Ableton :: Marker *, Ableton :: Marker *) в /..../MarkerContainer.o и /..../main.o для архитектуры x86_64 clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова) Сбой команды / разработчика / usr / bin / clang ++ с кодом выхода 1

Еще раз спасибо заранее, можете ли вы предложить мне какую-нибудь книгу о STL и о том, как она работает "под землей", чтобы лучше понять, что произошло в этих случаях с технической точки зрения

pedr0

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Конечно: вы не можете использовать std::sort() для сортировки std::list<T>, потому что std::sort() требует итераторов произвольного доступа. Однако std::list<T> поддерживает только двунаправленные итераторы. Вы можете использовать std::list<T>::sort(), однако.

2 голосов
/ 03 февраля 2012

В дополнение к требованиям итератора, указанным Дитмаром, sort также предоставит элементы списка вашему DeferencedCompare.Эти элементы имеют тип Marker*, в то время как ваша функция сравнения принимает аргументы типа Marker* const* p1.

. По названию, я думаю, вы, вероятно, хотели написать это:* Что, кстати, требует, чтобы m1 < m2 было определено для объектов m1 и m2 типа Marker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...