отсортировать структуру по нескольким полям
От: Аноним  
Дата: 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.