Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
akaAxeL
66 / 66 / 30
Регистрация: 14.07.2013
Сообщений: 251
#1

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

28.07.2014, 16:28. Просмотров 1995. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Sort vector, сортировка по двум полям структуры (C++):

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

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

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

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

Не работает функция sort (vector, vector) - C++
#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<vector<double>> + std::sort() - C++
Позвольте узнать... Возможно ли через vector&lt;vector&lt;double&gt;&gt; и функцию std::sort() отсортировать строки массива в лексикографическом...

6
zss
Модератор
Эксперт С++
6522 / 6084 / 2002
Регистрация: 18.12.2011
Сообщений: 15,826
Завершенные тесты: 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
216 / 161 / 45
Регистрация: 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 / 30
Регистрация: 14.07.2013
Сообщений: 251
28.07.2014, 19:06  [ТС] #4
Большое спасибо вам
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 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
675 / 278 / 12
Регистрация: 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Эксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
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 sort не сортирует - C++
Добрый день, подскажите, пожалуйста. Мне необходимо отсортировать вектор в котором хранится мой класс. Вроде все сделала,...

stl sort vector не сортирует ?! - C++
class Playlist { private: std::vector&lt;Song&gt; s_container; public: Playlist() { s_container=std::vector&lt;Song&gt;(); } ...

Структуры, массивы структур (как можно присваивать(инициализировать) значения полям структуры) - C++
Есть у меня вот такая структура, например struct Subject { int cost; int Volume; }; Потом создаю экземпляр, Subject G; ...

Сортировка vector<vector<int>> - C++
Всем привет, подскажите может есть вариант по-оптимальнее ? #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; int...


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

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

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