Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
akaAxeL
66 / 66 / 30
Регистрация: 14.07.2013
Сообщений: 251
28.07.2014, 16:28     Sort vector, сортировка по двум полям структуры #1
Поскажите как отсортировать если:
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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 16:28     Sort vector, сортировка по двум полям структуры
Посмотрите здесь:

Сортировка по полям структуры C++
C++ q-sort сортировка
C++ vector<vector<double>> + std::sort()
C++ stl sort vector не сортирует ?!
C++ Не работает функция sort (vector, vector)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,178
Завершенные тесты: 1
28.07.2014, 17:28     Sort vector, сортировка по двум полям структуры #2
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; 
 }
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
28.07.2014, 17:29     Sort vector, сортировка по двум полям структуры #3
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());
akaAxeL
66 / 66 / 30
Регистрация: 14.07.2013
Сообщений: 251
28.07.2014, 19:06  [ТС]     Sort vector, сортировка по двум полям структуры #4
Большое спасибо вам
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
28.07.2014, 19:18     Sort vector, сортировка по двум полям структуры #5
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_    );
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
28.07.2014, 21:33     Sort vector, сортировка по двум полям структуры #6
Я для таких случаев написал такую вот штуку:

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 );
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2014, 12:15     Sort vector, сортировка по двум полям структуры
Еще ссылки по теме:

Сортировка vector<vector<int>> C++
C++ Сортировка вектора по двум полям
Сортировка вектора записей по двум полям одновременно C++

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,419
29.07.2014, 12:15     Sort vector, сортировка по двум полям структуры #7
Советую ознакомиться Функторы, предикаты, функциональные адаптеры, лямбда-функции
Добавлю до кучи вариант с лямбдами:
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);
}
Yandex
Объявления
29.07.2014, 12:15     Sort vector, сортировка по двум полям структуры
Ответ Создать тему
Опции темы

Текущее время: 12:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru