powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / vector, struct и сортировка
15 сообщений из 15, страница 1 из 1
vector, struct и сортировка
    #34803059
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользую boost.

Есть структура
struct row {
std::string Org;
double Sum;
int ID;
};
Есть динамический массив структур std::vector <row> t;

И есть функция для упорядочивания
Код: plaintext
1.
2.
3.
4.
5.
6.
bool Test::sort_1(const  row &left, const row &right, bool compare)
 {
     if(compare)
       return left.Org > right.Org;
     else
       return left.Org < right.Org;
}

Упорядочиваю так
Код: plaintext
std::sort(this->t.begin(),  this->t.end(),  boost::bind(&Test::sort_1, this, _1, _2, false));

Хочтелось бы еще передавать в функцию сортировки какой именно элемент структуры нужно сортировать, ну там Org, sum или ID - как это можно сделать? Я голову уже сломал.
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804075
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ввести функциональный объект (вроде так он называется) в конструкторе ему передаешь параметры. Самого оспользуешь вместо буста.
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804175
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно ввести функциональный объект (вроде так он называется) в конструкторе ему передаешь параметры. Самого оспользуешь вместо буста.

А примерчик можно, а то у меня как раз это и не выходит.
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804256
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Borr авторМожно ввести функциональный объект (вроде так он называется) в конструкторе ему передаешь параметры. Самого оспользуешь вместо буста.

А примерчик можно, а то у меня как раз это и не выходит.
а чего там может не выходить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
MyComparator
{
public:
  enum Order
  {
   asc =  0 ,
   desc =  1 
  };
  MyComparator(int n, Order o) : no(n), order(o) {}
  bool operator () (const row& left, const row& right) {...}
private
  int no;
  Order order;
};
...
std::sort(this->t.begin(),  this->t.end(), MyComparator( 1 , MyComparetor::desc));

Только вот нахрен это надо?
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804329
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я чего-то недопонял. У меня несколько структур в которых по 10-15 элементов. Мне нужно передать в функцию какой именно элемент структуры нужно сортировать.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct row {
std::string Org;
double Sum;
int ID;
};
//Как сделать эту функцию универсальной - стобы она работала и с Org и с Sum и с ID
bool Test::sort_1(const  row &left, const row &right, bool compare)
 {
     if(compare)
       return left.Org > right.Org;
     else
       return left.Org < right.Org;
}
т.е больше всего интересует как будет выглядеть при таком раскладе вот эта функция bool operator () (const row& left, const row& right) {...} что там за этими тремя точками?

Из вашего примера я вижу только решение проблемы направления сортировки asc = 0, desc = 1 а с полем как быть?
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804501
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorrЯ чего-то недопонял. У меня несколько структур в которых по 10-15 элементов. Мне нужно передать в функцию какой именно элемент структуры нужно сортировать.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct row {
std::string Org;
double Sum;
int ID;
};
//Как сделать эту функцию универсальной - стобы она работала и с Org и с Sum и с ID
bool Test::sort_1(const  row &left, const row &right, bool compare)
 {
     if(compare)
       return left.Org > right.Org;
     else
       return left.Org < right.Org;
}
т.е больше всего интересует как будет выглядеть при таком раскладе вот эта функция bool operator () (const row& left, const row& right) {...} что там за этими тремя точками?

Из вашего примера я вижу только решение проблемы направления сортировки asc = 0, desc = 1 а с полем как быть?

Вы передаете в sort не функцию а объект. В конструкторе объекта вы передаете все параметры которые вам нужны. Например id поля по которому сортировать.
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804751
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не поймите превратно, по перегрузке оператора > или < и по свободной функции примеров полно. Об этом и в книгах не пишут. Прошу напишите поразвернутей пример или носом в ссылку ткните.
blinded ваш код я даже придумать не могу куда пристроить.
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804806
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorrНе поймите превратно, по перегрузке оператора > или < и по свободной функции примеров полно. Об этом и в книгах не пишут. Прошу напишите поразвернутей пример или носом в ссылку ткните.
blinded ваш код я даже придумать не могу куда пристроить.

Читать надо не про перегрузку оператра, а про объекты-функции и предикаты. Функция std::sort как раз его и получает в 3-м параметре.

Развернутей пример чем написал blinded сложно представить.
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804853
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разворачиваю std::sort в качестве 3 параметра потребляет объект называемый функтором у которого перегружен опреатор :
bool () (const T&, const T&)
по умолчанию туда пихают less. но можно пихнуть и что-нибудь другое, в частности boost::bind - это тоже функтор, в конце-концов можно посмотреть его исходники
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34804892
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh и blinded спасибо огромное, заработало именно как хотелось . Я сразу за деревьями леса не увидел + boost теперь не нужен.

Остался один вопрос
blindedТолько вот нахрен это надо?

Как это? Почему не надо это же гораздо удобнее чем 15-30 однотипных функций... или нет?
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34805015
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) это не очевидно, и как следствие увеличивает вероятность ошибки
2) э то медленнее чем писать руками
Лучше написать компараторов
типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
bool Org_less(const row& l, const row& r)
{
  return l.Org < r .Org;
}
bool Org_greater(const row& l, const row& r)
{
  return l.Org > r.Org;
}
Главное что это линейно и компилятор тупо все проверит, не говоря уже о том что на runtime if-ов не будет
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34805144
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded
Лучше написать компараторов
типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
bool Org_less(const row& l, const row& r)
{
  return l.Org < r .Org;
}
bool Org_greater(const row& l, const row& r)
{
  return l.Org > r.Org;
}
Главное что это линейно и компилятор тупо все проверит, не говоря уже о том что на runtime if-ов не будет

Тут у меня тоже проблема: если struct и vector с компараторами (простыми функциями) в cpp файле все нормально. А мне нужно в public vector засунуть - запихиваю в раздел public (или private) struct и vector - это заголовочный файл (h) и все даже не компилиться. Я из-за этого в boost и полез.
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34805204
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Тут у меня тоже проблема: если struct и vector с компараторами (простыми функциями) в cpp файле все нормально. А мне нужно в public vector засунуть - запихиваю в раздел public (или private) struct и vector - это заголовочный файл (h) и все даже не компилиться. Я из-за этого в boost и полез.

Прошу прощения и тут я недочитал - простая функция, в таком случае, должна быть тогда объявлена как static
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34805547
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну яснен пень, на нее же указатель должен быть...
Так в что в cpp ee или пиши классы-компараторы
...
Рейтинг: 0 / 0
vector, struct и сортировка
    #34805609
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу яснен пень, на нее же указатель должен быть...
Так в что в cpp ee или пиши классы-компараторы


Или сделать статиком эту функцию.

Мне тут показали как с boost'ом это в одну строчку сделать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include <boost\lambda\lambda.hpp>
using namespace boost::lambda;

...

//Сортировка по возрастанию по полю row::Org
sort(t.begin(), t.end(), (&_1) ->* &row::Org < (&_2) ->* &row::Org);

Спасибо, k3Eahn
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / vector, struct и сортировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]