Поиск:

Ответ в темуСоздание новой темы Создание опроса
> algorith max_element(begin,end,compare) compare ?? функция всегда должна быть глобальной 
V
    Опции темы
cooper123
Дата 30.5.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нашел вопрос который меня интересует тут
http://forum.vingrad.ru/forum/topic-154147...try1151357.html

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

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



Цитата(cooper123 @  30.5.2008,  17:04 Найти цитируемый пост)
почему нельзя структуру определить как класс и в классе задать функцию сравнения
Кто сказал, что нельзя? 

Ммм... Скажем, вот так:
Код

struct stSOME
{
    int intField;
    char cOtherField;

    bool operator()(const stSOME& first, const stSOME& second) {
        return (first.intField < second.intField);
    }

} g_SampleInit[] = {
                    {0, '0'},
                    {1, '1'},
                    {2, '2'},
                    {3, '3'},
                    {4, '4'},
                    {5, '5'}
                 };
...
// вызывать - вот так:
std::cout<<"\nstd::max_element() result: "<<std::max_element(vectSome.begin(), vectSome.end(), stSOME())->intField;
...

?
PM MAIL   Вверх
Rififi
Дата 30.5.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 36



Цитата(cooper123 @  30.5.2008,  17:04 Найти цитируемый пост)
насчет функций сравнений они всегда должны быть глобальными??

по Стандарту, локальный тип не может быть использован в качестве аргумента шаблона

Цитата
[(14.3.1/2)
A type without linkage (3.5) shall not be used as a template-argument for a template type-parameter.
[ Example:
template <class T> class X { / ... / };
void f() {
struct S { / ... / };
X<S> x3; // error: local type used as template-argument
X<S*> x4; // error: pointer to local type used as template-argument
}



PM MAIL   Вверх
cooper123
Дата 30.5.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну это уже что то. 
но мне еще и мин_елемент надо  и там новый оператор нужен. 
 оператор >  почему то унарный и в таком плане не перегружается. а использовать другие для этой цели это же потом сам фиг догадаешься о чем речь идет. 

а с функциями никак?

тем не менее спасибо. 
PM MAIL   Вверх
Rififi
Дата 30.5.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 36



Цитата(cooper123 @  30.5.2008,  21:50 Найти цитируемый пост)
но мне еще и мин_елемент надо  и там новый оператор нужен. 
 оператор >  почему то унарный и в таком плане не перегружается. а использовать другие для этой цели это же потом сам фиг догадаешься о чем речь идет. 

это просто поток сознания или спросить что-то хотел? ибо я ничего не понял.
PM MAIL   Вверх
volvo877
Дата 30.5.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



Цитата(cooper123 @  30.5.2008,  21:50 Найти цитируемый пост)
но мне еще и мин_елемент надо  и там новый оператор нужен. 
С чего бы? Что, 
Код
std::cout<<"\nstd::min_element() result: "<<std::min_element(vectSome.begin(), vectSome.end(), stSOME())->intField;

не выдаст тебе минимальный элемент по тому же признаку? Ошибаешься, выдаст... В приведенном примере - 0.
PM MAIL   Вверх
cooper123
Дата 30.5.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



можно использовать статические функции 

class my_class(){

....

static bool compar(const el& el_1, const el& el_2){

         return (el_1 > el2);

}

min_element(my_class.begin(),my_class.end(),my_class::compar);

Это сообщение отредактировал(а) cooper123 - 2.6.2008, 14:10
PM MAIL   Вверх
Vyacheslav
Дата 3.6.2008, 14:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



А может все гораздо проще: просто переопределяем оператор  < smile
Код

 struct stSOME
{
    int intField;
    char cOtherField;
    bool operator<( const stSOME& val) const {
        return (intField < val.intField);
    }

} g_SampleInit[] = {
                    {0, '0'},
                    {1, '1'},
                    {2, '2'},
                    {3, '3'},
                    {4, '4'},
                    {5, '5'}
                 };


//...
std::cout<<"\nstd::max_element() result: "<<std::max_element(vectSome.begin(), vectSome.end() )->intField;
std::cout<<"\nstd::max_element() result: "<<std::min_element(vectSome.begin(), vectSome.end() )->intField;




Добавлено @ 14:41
Цитата(volvo877 @  30.5.2008,  18:51 Найти цитируемый пост)
Ммм... Скажем, вот так:

Ну вообще то тоже решение, но скажем весьма странное.  Фактически Вы предложили объединть функциональности структуры  хранения данных с  предикатом.
То есть здесь 
Код

std::cout<<"\nstd::max_element() result: "<<std::max_element(vectSome.begin(), vectSome.end(), stSOME())->intField;

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



 stSOME st_some;
std::cout<<"\nstd::max_element() result: "<<std::max_element(vectSome.begin(), vectSome.end(),  st_some)->intField;

Тогда уж логичнее было обЪявить статическую функцию



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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