отсортировать структуру по нескольким полям
От: Аноним  
Дата: 18.01.08 15:14
Оценка:
Как сделать сабж. используя stl?
Нужно как-то группировать по отдельным полям, но что-то в голову ничего не идет.
Вот код, основной интерес представляет ф-ция less
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>

struct A
{
    A(std::string const& s, int n): s(s), n(n){}

    static void print(A const& a)
    {
        std::cout << a.s.c_str() << "\t" << a.n << std::endl;
    }

    // compare function!
    static bool less(A const& lhs, A const& rhs)
    {
        return lhs.s < rhs.s || (lhs.s < rhs.s && lhs.n < rhs.n);
    }

private:
    std::string s;
    int        n;
};

void test2()
{
    // init
    std::vector<A>v;
    v.push_back(A("a", 0));
    v.push_back(A("b", 1));
    v.push_back(A("a", 1));
    v.push_back(A("c", 2));
    v.push_back(A("a", 1));
    v.push_back(A("a", 0));
    v.push_back(A("b", 1));
    v.push_back(A("z", 1));
    v.push_back(A("z", 0));
    v.push_back(A("z", 5));

    // print expected result
    std::cout << "expected" << std::endl;
    std::cout << "a\t0" << std::endl;
    std::cout << "a\t0" << std::endl;
    std::cout << "a\t1" << std::endl;
    std::cout << "a\t1" << std::endl;
    std::cout << "b\t1" << std::endl;
    std::cout << "b\t1" << std::endl;
    std::cout << "c\t2" << std::endl;
    std::cout << "z\t0" << std::endl;
    std::cout << "z\t1" << std::endl;
    std::cout << "z\t5" << std::endl;

    // sort and print final result
    std::cout << "final" << std::endl;
    std::sort(v.begin(), v.end(), A::less);
    std::for_each(v.begin(), v.end(), A::print);
}

int main(int argc, char* argv[])
{
    test2();
    return 0;
}
Re: отсортировать структуру по нескольким полям
От: VoidEx  
Дата: 18.01.08 15:43
Оценка:
Здравствуйте, Аноним, Вы писали:


    // compare function!
    static bool less(A const& lhs, A const& rhs)
    {
        return lhs.s < rhs.s || (lhs.s == rhs.s && lhs.n < rhs.n);
    }
Re: отсортировать структуру по нескольким полям
От: Sergey Россия  
Дата: 18.01.08 15:45
Оценка:
> Нужно как-то группировать по отдельным полям, но что-то в голову ничего не идет.

Типа такого:
    static bool less(A const& lhs, A const& rhs)
    {
        int sc = lhs.s.compare(rhs.s);
        if (sc == 0)
            return lhs.n < rhs.n;
        else
            return sc < 0;
    }
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.