Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
akaAxeL
66 / 66 / 59
Регистрация: 14.07.2013
Сообщений: 251
#1

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

28.07.2014, 16:28. Просмотров 2686. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 16:28
Ответы с готовыми решениями:

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

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

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

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

Сортировка по полям структуры
Необходимо сортировать параграфы по возрастанию. Структура имеет вид: struct...

6
zss
Модератор
Эксперт С++
7098 / 6629 / 4196
Регистрация: 18.12.2011
Сообщений: 17,478
Завершенные тесты: 1
28.07.2014, 17:28 #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; 
 }
1
SlavaSSU
217 / 162 / 47
Регистрация: 17.07.2012
Сообщений: 587
28.07.2014, 17:29 #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());
1
akaAxeL
66 / 66 / 59
Регистрация: 14.07.2013
Сообщений: 251
28.07.2014, 19:06  [ТС] #4
Большое спасибо вам
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
28.07.2014, 19:18 #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_    );
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
0
Voivoid
708 / 280 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
28.07.2014, 21:33 #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 );
3
MrGluck
Модератор
Эксперт CЭксперт С++
8078 / 4931 / 1431
Регистрация: 29.11.2010
Сообщений: 13,366
29.07.2014, 12:15 #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);
}
0
29.07.2014, 12:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2014, 12:15

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru