Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > STL не работает less со структурой


Автор: Познающий 2.6.2009, 12:15
Доброго времени суток!
Тут проблемка одна, нужно написать программу с использованием stl которая отображает таблицу чемпионата по футболу.
В общем структура есть, но проблема в том, что критерий отборки должен быть именно less. Я написал свой критерий Cless но препод этого не примет просто.
Вот сама прога
#include <iostream>
#include <vector>
#include <functional>
#include <fstream>
#include <algorithm>
#include <queue>
using namespace std;

struct Fteam{
    int goal;
    char* name;
    friend ostream operator <<(ostream&out,Fteam a){
    out<<a.name<<" "<<a.goal;
    return out;
    }
    friend istream operator >>(istream&in,Fteam a){
        in>>a.goal;
        in>>a.name;
        return in;
    }
    bool operator<(Fteam&right){
        return (goal<right.goal);// return false;
    //else return true;
    }
    Fteam(int g,char*nm){
        goal=g;
        name=nm;
    }
    bool operator() (Fteam x,Fteam y){
        return (x<y);
    }
    Fteam(){name=0;goal=0;}

};


};

void main(){
Fteam a(1,"one");
priority_queue <Fteam,vector<Fteam>,less<Fteam> > q;
q.push(a);
int cnt=1;
do{
    a=q.top();
    cout<<cnt<<" place is "<<a<<"\n";cnt++;
    q.pop();
}while ( !q.empty() );


}


Вот... Ругается виз 6,0 на оператор < и вроде бы как на ()
include\functional(86) : error C2678: binary '<' : no operator defined which takes a left-hand operand of type 'const struct Fteam' (or there is no acceptable conversion)
  \functional(86) : while compiling class-template member function 'bool __thiscall std::less<struct Fteam>::operator ()(const struct Fteam &,const struct Fteam &) const'
Люди, поясните, что не так  smile 



Автор: azesmcar 2.6.2009, 12:25
мутно как-то все..
свой less писать не надо, просто специализировать и все
вот так
Код

struct mystruct
{
    int a;
};

template <>
struct std::less<mystruct>
{
    bool operator ()(const mystruct& l, const mystruct& r) const {
        return l.a < r.a;
    }
};

Автор: Познающий 2.6.2009, 12:52
Работает!! smile 
Цитата

мутно как-то все..


))) ё-моё) это я еще кое-что выкинул из кода ))
Ну там...пару закоментированных перегруженных операторов...
Вот, думаю, как отточить стиль правильного и красивого программирования)) А то видел у одногрупника код, такая красота))

Код

template <>
struct std::less<mystruct>


А можно тут поподробнее?)))
Как у компилятора не возник вопрос касательно пустых скобок шаблона?
И как сработала вторая строчка?
Я вызывал стд, он выдал автоматом две переменные что у меня есть. Просто я не совсем понял. 
То есть эта запись означает : Пространство - структура, (:smile а там используется less... так чтоли?)

Автор: zim22 2.6.2009, 12:53
Цитата(Познающий @  2.6.2009,  12:52 Найти цитируемый пост)
Как у компилятора не возник вопрос касательно пустых скобок шаблона?

это называется специализация шаблона. для этого и указываются пустые скобки.
хотите освоить шаблоны - прочитайте Вандевурда Шаблоны С++ Справочник разработчика smile

Автор: Lazin 2.6.2009, 14:14
Цитата(azesmcar @  2.6.2009,  12:25 Найти цитируемый пост)
просто специализировать и все

специализировать ничего не нужно, нужно правильно реализовать оператор < для своего класса smile 

Код

bool operator < (Fteam const& right)
const {
    return goal < right.goal;
}

Автор: azesmcar 2.6.2009, 14:27
Цитата(Lazin @  2.6.2009,  14:14 Найти цитируемый пост)
специализировать ничего не нужно, нужно правильно реализовать оператор < для своего класса smile 

это уже не ко мне, это к топикстартеру
Цитата(Познающий @  2.6.2009,  12:15 Найти цитируемый пост)
должен быть именно less


Автор: mes 2.6.2009, 14:47
Цитата(Lazin @  2.6.2009,  13:14 Найти цитируемый пост)
специализировать ничего не нужно, нужно правильно реализовать оператор < для своего класса smile 

Цитата(azesmcar @  2.6.2009,  13:27 Найти цитируемый пост)
это уже не ко мне, это к топикстартеру

если есть оператор <  то можно без проблем использовать less. smile

Автор: azesmcar 2.6.2009, 14:52
mes

а кто-то спорит? тс попросил less, я его дал так чтобы он работал smile 
тема называется
Цитата

не получается реализовать less


Автор: Познающий 2.6.2009, 15:03
не)) я как раз перегружал, ведь оператор меньше))
Всё с того и началось)

Автор: azesmcar 2.6.2009, 15:09
Познающий

С константами намудрил
Код

struct mystruct {
    int i;

    bool operator<(const mystruct& right) const {
        return i < right.i;
    }
};

int main(){
    priority_queue <mystruct, vector<mystruct> > q;
}

вот рабочий пример, дорабатывайте

с операторами тоже сильно намудрено smile

Добавлено @ 15:17
Познающий

Код

#include <iostream>
#include <vector>
#include <functional>
#include <fstream>
#include <algorithm>
#include <queue>

using namespace std;

struct Fteam{
    int goal;
    char* name;
    friend ostream& operator << (ostream&, const Fteam&);
    friend istream& operator >> (istream&, Fteam&);

    bool operator<(const Fteam&right) const {
        return (goal<right.goal);// return false;
        //else return true;
    }
    Fteam(int g,char*nm){
        goal=g;
        name=nm;
    }
    bool operator() (Fteam x,Fteam y){
        return (x<y);
    }
    Fteam(){name=0;goal=0;}

};

ostream& operator << (ostream& out, const Fteam& a)
{
    out << a.name << " " << a.goal;
    return out;
}

istream& operator >> (istream& inp, Fteam& a)
{
    inp >> a.goal >> a.name;
    return inp;
}

void main(){
    Fteam a(1,"one");
    priority_queue <Fteam,vector<Fteam>,less<Fteam> > q;
    q.push(a);
    int cnt=1;
    do{
        a=q.top();
        cout<<cnt<<" place is "<<a<<"\n";cnt++;
        q.pop();
    }while ( !q.empty() );
}

вот, немного исправил, жить будет, но желательно чтоб недолго smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)