Sortowanie wektora wektora stringów

Odpowiedz Nowy wątek
2014-04-27 20:50

Rejestracja: 8 lat temu

Ostatnio: 2 lata temu

0

Otóż chciałbym posortować tak jak w temacie std::vector<std::vector<std::string>> data. Problem w tym że nie wiem jak zrobić by dało się sortować zmienną kolumnę wektora, funkcja porównująca w std musi być statyczna. Jak coś takiego najłatwiej można posortować ?


class X :
static bool compare(std::vector<std::string> &a, std::vector<std::string> &b)
    {
        return a[2] < b[2];
    }
...
//jakas metoda
std::sort(data.begin(), data.end(),compare);
//sortuje 3 kolumnę, tutaj powinno się dać ustawić którą kolumne ma sortować  

Pozostało 580 znaków

2014-04-27 20:59
Moderator

Rejestracja: 16 lat temu

Ostatnio: 8 godzin temu

1

Jeśli dobrze cie rozumiem to odpowiedź brzmi: możesz użyć szablonu gdzie parametrem jest wartość a nie typ, tzn

template<int N >
bool compare(std::vector<std::string> &a, std::vector<std::string> &b)
{
    return a[N] < b[N];
}

Coś takiego:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

template<int N >
bool compare(std::vector<std::string> &a, std::vector<std::string> &b)
{
    return a[N] < b[N];
}

int main(){
    vector<string> v1;
    v1.push_back("1");
    v1.push_back("2");
    v1.push_back("3");
    vector<string> v2;
    v2.push_back("3");
    v2.push_back("2");
    v2.push_back("1");
    cout<<compare<0>(v1,v2)<<endl;
    cout<<compare<1>(v1,v2)<<endl;
    cout<<compare<2>(v1,v2)<<endl;
    return 0;
}

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2014-04-27 21:03

Pozostało 580 znaków

2014-04-27 21:11

Rejestracja: 8 lat temu

Ostatnio: 2 lata temu

0

A jednak nie :(. Wartość wyrażenia musi być stała :(
P.S Do szablonu nie da się wpisać zmiennej :(

edytowany 2x, ostatnio: kolarz3, 2014-04-27 21:24

Pozostało 580 znaków

2014-04-27 21:31
Moderator

Rejestracja: 16 lat temu

Ostatnio: 8 godzin temu

Jak ma być zmienna to użyj funktora na przykład:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

class Compare{
    private:
        int N;
    public:
        Compare(int n):N(n){}
        bool operator()(const std::vector<std::string> &a, const std::vector<std::string> &b) const
        {
            return a[N] < b[N];
        }
};

int main(){
    vector<string> v1;
    v1.push_back("1");
    v1.push_back("2");
    v1.push_back("3");
    vector<string> v2;
    v2.push_back("3");
    v2.push_back("2");
    v2.push_back("1");

    vector<vector<string> > v3;
    v3.push_back(v1);
    v3.push_back(v2);
    sort(v3.begin(), v3.end(), Compare(0));
    cout << v3[0][0];
    sort(v3.begin(), v3.end(), Compare(1));
    cout << v3[0][0];
    sort(v3.begin(), v3.end(), Compare(2));
    cout << v3[0][0];
    return 0;
}

Jeśli to C++11 to możesz zamiast klasy takiego komparatora zrobić sobie function<>


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 2x, ostatnio: Shalom, 2014-04-27 21:52

Pozostało 580 znaków

2014-04-27 21:53

Rejestracja: 8 lat temu

Ostatnio: 2 lata temu

0

Działa :)

Pozostało 580 znaków

gośćabc
2014-04-28 13:27
gośćabc
0

http://ideone.com/zpCb8S

funkcję sortującą definiujesz jako 2 parametr funkcji foo (lambda)

działa dla większości kontenerów

foo zwraca pierwszy element posortowanego kontenera

edit:
tytuł

to tylko ciekawostka, uniwersalne rozwiązanie dla każdego typu, nie tylko std::string

fajna zabawa

edit2:

standardowy płacz "nie na temat"

a może jesteś zbyt słaby, aby wykorzystać tę funckję

http://ideone.com/QNIrI3

edytowany 2x, ostatnio: Shalom, 2016-12-13 18:26
Lambda spoko, ale przeczytałeś w ogóle jaki autor ma problem? Czy tylko tytuł wątku? ;] - Shalom 2014-04-28 13:45
Widać nawet i tytułu nie przeczytałeś dokładnie bo miał być vector vectora stringów a nie vector stringów ;] poza tym miał być sortowany wg wybranej kolumny tego wewnętrznego vectora. W efekcie twój post jest zupełnie nie na temat. - Shalom 2014-04-28 13:59

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0