Sortowanie wektora wektora stringów

0

Otóż chciałbym posortować tak jak w temacie std::vector<std::vectorstd::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ć  
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;
}
0

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

1

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<>

0

Działa :)

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

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