Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/48: Рейтинг темы: голосов - 48, средняя оценка - 4.52
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251

Sort vector, сортировка по двум полям структуры

28.07.2014, 16:28. Показов 10246. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поскажите как отсортировать если:
C++
1
2
3
4
5
6
7
8
9
struct DATA{
    string fir;
    string sec;
    double sm;
};
vector <DATA> vec;
vector <DATA>::iterator itv;
bool myfunction (DATA i,DATA j) { return (atoi(i.fir.c_str()) < atoi(j.fir.c_str()) && (atoi(i.sec.c_str()) < atoi(j.sec.c_str()))); }
sort(vec.begin(),vec.end(),myfunction);
если в векторе допустим инфа лежит так(fir,sec,sm) (1,9,1000)(3,1,1000)(2,1,1000), а надо чтобы сортировалось и по fir и по sec. Тоесть на выходе после сортирвки должно быть (0,0,1000)(0,1,1000)...(0,30,1000) ..(1,0,1000)...(30,30,1000)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.07.2014, 16:28
Ответы с готовыми решениями:

Сортировка по двум полям
Здравствуйте, уважаемые! Есть такой map частотный словарь: 155 hello 74 welcome 50 car 18 red 4 digital ...

Сортировка вектора по двум полям
Вектор состоит из структуры с двумя полями: день недели и время. Нужно отсортировать так, чтобы сначала в векторе хранились структуры, у...

Сортировка вектора записей по двум полям одновременно
Здравствуйте, не получается создать две разных функции перегрузки оператора &lt;:одну для сортировки первого поля класса,вторую для...

6
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
28.07.2014, 17:28
C++
1
2
3
4
5
6
7
8
9
10
11
bool myfunction (DATA i,DATA j) 
{
    if(  atoi(i.fir.c_str()) < atoi(j.fir.c_str()) )
               return true;
    else
    {
         if (  atoi(i.fir.c_str()) == atoi(j.fir.c_str())  &&   atoi( i.sec.c_str() ) < atoi(j.sec.c_str()  )
                     return true;
    } 
    return false; 
 }
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
28.07.2014, 17:29
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
bool operator <(const Data &a, const Data &b)
{
if(a.ft != b.ft)
return a.ft < b.ft;
return a.sc < b.sc;
}
 
//....
 
sort(vec.begin(), vec.end());
1
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
28.07.2014, 19:06  [ТС]
Большое спасибо вам
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
28.07.2014, 19:18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
#include <utility>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_data
{
    //-----------------------------------------------------------------------------------
    T_str   first_;
    T_str   second_;
    double  d_;
    //-----------------------------------------------------------------------------------
    bool    operator<   ( T_data    const   &   data )
    {
        return      std::make_pair( first_,         second_         )
                <   std::make_pair( data.first_,    data.second_    );
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
28.07.2014, 21:33
Я для таких случаев написал такую вот штуку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#pragma once
 
#include <functional>
#include <vector>
 
    template <typename T>
    class chain_comparer {
        typedef std::function<bool( const T&, const T& )> comparer;
 
    public:
        
        //comparer.chain<std::greater>( boost::bind( &person::name, _1 ) );
        template <template <typename> class Comparer, typename Getter>
        chain_comparer& chain( const Getter& getter ) {
            typedef std::remove_reference<std::result_of<Getter(T)>::type>::type result_type;
            return chain( Comparer<result_type>(), getter );
        }
 
        //comparer.chain( std::greater<std::string>(), boost::bind( &person::name, _1 ) );
        template <typename Comparer, typename Getter>
        chain_comparer& chain( const Comparer& comparer, const Getter& getter ) {
            i_comparers.push_back( std::bind( comparer, std::bind( getter, std::placeholders::_1 ), std::bind( getter, std::placeholders::_2 ) ) );
            return *this;
        }
 
        //cmp.chain<std::greater>( &person::name );
        template <template <typename> class Comparer, typename ValType>
        chain_comparer& chain( ValType T::* member ) {
            return chain( Comparer<ValType>(), member );
        }
 
        //comparer.chain( std::greater<std::string>(), &person::name );
        template <typename Comparer, typename ValType>
        chain_comparer& chain( const Comparer& comparer, ValType T::* member ) {
            i_comparers.push_back( std::bind( comparer, std::bind( member, std::placeholders::_1 ), std::bind( member, std::placeholders::_2 ) ) );
            return *this;
        }
 
        bool operator()( const T& lhs, const T& rhs ) {
            for( const auto& comparer : i_comparers ) {
                if( comparer( lhs, rhs ) ) return true;
                if( comparer( rhs, lhs ) ) return false;
            }
 
            return false;
        }
 
    private:
        std::vector<comparer> i_comparers;
    };
Использовать так:

C++
1
2
3
4
    chain_comparer<DATA> comparer;
    comparer.chain<std::less>( &DATA::fir );
    comparer.chain<std::less>( &DATA::sec );
    std::sort( vec.begin(), vec.end(), comparer );
3
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.07.2014, 12:15
Советую ознакомиться Функторы, предикаты, функциональные адаптеры, лямбда-функции
Добавлю до кучи вариант с лямбдами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <algorithm>
#include <iostream>
#include <vector>
 
struct S
{
    int x, y, z;
};
 
int main()
{
    using vec_S = std::vector<S>;
    vec_S v = {{1, 9, 1000}, {3, 1, 1000}, {2, 1, 1000}, {1, 8, 1000}};
    auto print_v = [](const vec_S &vec)
    {
        for (auto el: vec)
            std::cout << "(" << el.x << ", " << el.y << ", " << el.z << ") ";
        std::cout << std::endl;
    };
 
    std::cout << "Before: ";
    print_v(v);
    std::sort(v.begin(), v.end(), [](const S &lhs, const S &rhs) { return lhs.x != rhs.x ? lhs.x < rhs.x : lhs.y < rhs.y; });
    std::cout << "After: ";
    print_v(v);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2014, 12:15
Помогаю со студенческими работами здесь

Сортировка структуры по полям
Мне нужно было сделать базу данных контактов и сделать сортировку по фамилиям и номеру телефону. Базу я сделал ,используя шаблон стек. Но...

Сортировка по полям структуры
Необходимо сортировать параграфы по возрастанию. Структура имеет вид: struct gloss { char term; bool flag; int nom; } ...

vector<vector<double>> + std::sort()
Позвольте узнать... Возможно ли через vector&lt;vector&lt;double&gt;&gt; и функцию std::sort() отсортировать строки массива в лексикографическом...

Не работает функция sort (vector, vector)
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;algorithm&gt; using namespace std; class...

Vector sort не сортирует
Добрый день, подскажите, пожалуйста. Мне необходимо отсортировать вектор в котором хранится мой класс. Вроде все сделала,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru