Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL 
V
    Опции темы
Dmi3ev
Дата 14.3.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



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

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

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

vector<forexample> v;

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

Это сообщение отредактировал(а) Dmi3ev - 15.3.2009, 00:01


--------------------

PM MAIL   Вверх
mes
Дата 14.3.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250





--------------------
PM MAIL WWW   Вверх
Dmi3ev
Дата 14.3.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

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

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

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


--------------------

PM MAIL   Вверх
Lazin
Дата 15.3.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



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

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

Добавлено через 19 секунд
что именно, все телепаты уже пьяны smile 
PM MAIL Skype GTalk   Вверх
mes
Дата 15.3.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



покажи функцию сравнения и как вызываешь

Добавлено @ 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);




Это сообщение отредактировал(а) mes - 15.3.2009, 00:14


--------------------
PM MAIL WWW   Вверх
Dmi3ev
Дата 15.3.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



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

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 '<'
почему?


--------------------

PM MAIL   Вверх
zim22
Дата 15.3.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



немного подправил код (добавил ветку 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;
}




--------------------
PM MAIL   Вверх
Dmi3ev
Дата 15.3.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Цитата

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

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



--------------------

PM MAIL   Вверх
zim22
Дата 15.3.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



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

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


--------------------
PM MAIL   Вверх
Dmi3ev
Дата 15.3.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



Код

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 секунд
Теперь только интересно, а почему Билдер это кушает только в путь???


--------------------

PM MAIL   Вверх
mes
Дата 15.3.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(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;
}



Это сообщение отредактировал(а) mes - 15.3.2009, 16:09


--------------------
PM MAIL WWW   Вверх
Dmi3ev
Дата 15.3.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



mes, конечно так мощнее... спасибо...

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


--------------------

PM MAIL   Вверх
mes
Дата 15.3.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
Dmi3ev
Дата 15.3.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



спасибо большое всем за обсуждение...

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

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

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


--------------------

PM MAIL   Вверх
mes
Дата 16.3.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(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;
}


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

Это сообщение отредактировал(а) mes - 16.3.2009, 10:21


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1239 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.