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


Автор: Dmi3ev 14.3.2009, 23:52
Как мне самому определить правила сортировки в sort()?
те, например, у меня структура вида:
Код

struct mydate
{
    int d;
    int m;
    int y;
};
struct forexample
{
    char name[256];
    struct mydate date;
};

и я создаю в программе
Код

vector<forexample> v;

как мне сортировать по имени и по дате??? те задавать свои правила сортировки???
че-то получается, но...  smile 

Автор: mes 14.3.2009, 23:55
http://www.cplusplus.com/reference/algorithm/sort.html

Автор: Dmi3ev 14.3.2009, 23:56
Цитата

как мне сортировать по имени и по дате???

не так немного выразился, не одновременно, а поочереди хотя бы... дальше сам смогу думаю, просто я третьим параметром в sort указываю свою функцию сравнения, но че-то не айс...

Добавлено через 55 секунд
mes, отсюда я и начал, но что-то туго, можно пример для моего случая... 

Автор: Lazin 15.3.2009, 00:04
Цитата(Dmi3ev @  14.3.2009,  23:56 Найти цитируемый пост)
указываю свою функцию сравнения, но че-то не айс...

не айс это:
  • не компилируется
  • компилируется но не работает как ожидается

Добавлено через 19 секунд
что именно, все телепаты уже пьяны smile 

Автор: mes 15.3.2009, 00:06
покажи функцию сравнения и как вызываешь

Добавлено @ 00:13
вот набросок : 
Код

struct forexample
{
  int           index;
  std::string   name;
};

bool less_by_index (const forexample& lhs, const forexample& rhs )
{
   return lhs.index < rhs.index;
}

bool less_by_name (const forexample& lhs, const forexample& rhs )
{
   return lhs.name < rhs.name;
}

.. 
std::vector<forexample> v;
..
std::sort (v.begin(), v.end(), less_by_index);
..
std::sort (v.begin(), v.end(), less_by_name);



Автор: Dmi3ev 15.3.2009, 12:39
оказывается, я могу провести аналогию между кодом (который по ссылке) и своим... это радует, а то я отчаялся уже.... начал просить, чтобы вы мне показали, просто в студии работать не хочет...
Код

struct mydate
{
    int d;
    int m;
    int y;
};
struct forexample
{
    char name[256];
    struct mydate mdate;
};

bool myf1(forexample fe1, forexample fe2)
{
    if(strcmp(fe1.name, fe2.name)<0)
        return true;
}
int main()
{
    vector<forexample> vfe;
    forexample m1;
    forexample m2;
    strcpy(m1.name, "Dmi3ev");
    strcpy(m2.name, "Lazin");
    vfe.push_back(m2);
    vfe.push_back(m1);
    for (int i=0; i<vfe.size(); i++)
        cout<<vfe[i].name<<endl;
    sort(vfe.begin(), vfe.end(), myf1);
    for (int i=0; i<vfe.size(); i++)
        cout<<vfe[i].name<<endl;
    system("pause");
    return 0;
}

в Билдер 6 это работает нормально а в VS говорит:
Line: 3128
Expression: invalid operator '<'
почему?

Автор: zim22 15.3.2009, 13:01
немного подправил код (добавил ветку else в ф-ю myf1. работает у меня в студии.

Код

#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

struct mydate
{
    int d;
    int m;
    int y;
};
struct forexample
{
    char name[256];
    struct mydate mdate;
};

bool myf1(forexample fe1, forexample fe2)
{
    if(strcmp(fe1.name, fe2.name)<0)
        return true;
    else
        return false;
}
int main()
{
    vector<forexample> vfe;
    forexample m1;
    forexample m2;
    strcpy(m1.name, "Dmi3ev");
    strcpy(m2.name, "Lazin");
    vfe.push_back(m2);
    vfe.push_back(m1);
    for (int i=0; i<vfe.size(); i++)
        cout<<vfe[i].name<<endl;
    sort(vfe.begin(), vfe.end(), myf1);
    for (int i=0; i<vfe.size(); i++)
        cout<<vfe[i].name<<endl;
    system("pause");
    return 0;
}


Автор: Dmi3ev 15.3.2009, 13:17
Цитата

немного подправил код (добавил ветку else в ф-ю myf1. работает у меня в студии.

тоже уже допер до этого...(((
вот лажа, а вчера весь вечер сидел втыкал...
все из-за того, что лень было написать else return false;
жалко из-за такого сидеть и тупить...
спасибо... 
ща сделаю с датой, тогда закрою тему, если получится...

Автор: zim22 15.3.2009, 13:22
Цитата(Dmi3ev @  15.3.2009,  13:17 Найти цитируемый пост)
все из-за того, что лень было написать else return false;

я сам не обратил внимание на нехватку else. Но компилятор напомнил: warning C4715: 'myf1' : not all control paths return a value
smile

Автор: Dmi3ev 15.3.2009, 13:23
Код

bool myf2(forexample fe1, forexample fe2)
{
    if((fe1.mdate.y<fe2.mdate.y) || 
       (fe1.mdate.y==fe2.mdate.y && fe1.mdate.m<fe2.mdate.m) || 
       (fe1.mdate.y==fe2.mdate.y && fe1.mdate.m==fe2.mdate.m &&fe1.mdate.d<fe2.mdate.d))
        return true;
    else 
        return false;
}

вот для даты что написал, вроде работает... как надо...

Добавлено через 2 минуты и 8 секунд
Цитата

я сам не обратил внимание на нехватку else. Но компилятор напомнил: warning C4715: 'myf1' : not all control paths return a value

я так же до этого дошел...  smile

Добавлено через 3 минуты и 10 секунд
Теперь только интересно, а почему Билдер это кушает только в путь???

Автор: mes 15.3.2009, 15:30
Цитата(Dmi3ev @  15.3.2009,  12:23 Найти цитируемый пост)
вот для даты что написал, вроде работает... как надо...

я бы разбил на две функции и операцию сравнения написал бы так :

Код

bool operator < (const mydate& lhs, const mydate& rhs)
{
   if   (lhs.y==rhs.y)
     if (lhs.m==rhs.m) return lhs.d < rhs.d;
     else              return lhs.m < rhs.m;
   else                return lhs.y < rhs.y;
}


a параметры передавал бы как константную ссылку :
Код

bool myf2(const forexample& fe1, const forexample& fe2)
{
   return fe1.data < fe2.data;
}


Автор: Dmi3ev 15.3.2009, 16:05
mes, конечно так мощнее... спасибо...

Добавлено через 1 минуту и 40 секунд
а это так специально?
bool operator < (const mydate& lhs, mydate& rhs) или надо вот так
bool operator < (const mydate& lhs, const mydate& rhs)
просто опечатка? 

Автор: mes 15.3.2009, 16:10
Цитата(Dmi3ev @  15.3.2009,  15:05 Найти цитируемый пост)
а это так специально?

опечатка - исправил smile

Автор: Dmi3ev 15.3.2009, 16:16
спасибо большое всем за обсуждение...

Добавлено через 3 минуты и 28 секунд
кстати второй раз уже сталкиваюсь с такой вещью, что в Билдере не совсем верный код понимает как верный...
в классе еще было, что тип метода не указал, те написал,допустим
Код

Set(char *s1)
{
//...
}

а он тип по умолчанию int поставил... но в принципе запись ведь неверная...
и тут тоже... в билдере работает, а в студии ошибка...

Автор: mes 16.3.2009, 10:18
Цитата(mes @  15.3.2009,  14:30 Найти цитируемый пост)
и операцию сравнения написал бы так :
Код

bool operator < (const mydate& lhs, const mydate& rhs)
{
   if   (lhs.y==rhs.y)
     if (lhs.m==rhs.m) return lhs.d < rhs.d;
     else              return lhs.m < rhs.m;
   else                return lhs.y < rhs.y;
}


чего то вдруг захотелось мне эту функцию перефразировать : 
Код

bool operator < (const mydate& lhs, const mydate& rhs)
{
   return  (lhs.y == rhs.y) ? (lhs.m == rhs.m) ? lhs.d < rhs.d
                                               : lhs.m < rhs.m
                            : lhs.y < rhs.y;
}


хм.. интересно а какой из примеров читается легче  ?!

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