2016-07-16 5 views
0

Ich versuche Sortierung einen Vektor von Tupel zu sortieren, aber ich habe einen seltsamen Fehler:Fehler, wenn Benutzerdefinierte einen Vektor von Tupeln

typedef std::tuple<const std::string, const std::string, const unsigned int> nodesfound; 

std::vector<nodesfound> nf; 

fil_vector(nf); 

std::sort(nf.begin(), nf.end(), [](nodesfound const &n1, nodesfound const &n2) { 
     return std::get<2>(n1) < std::get<2>(n2); 
    }); 

der Fehler ist:

/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/tuple:299:17: error: no viable overloaded '='_M_head(*this) = std::forward<_Head>(_M_head(__in)); 

wenn ich die Sortierlinie entfernen Mein Programm ist vollkommen in Ordnung

Antwort

1

Für sort zu arbeiten Elemente müssen unbedingt zuweisbar sein; Ihre Tupelelemente sind jedoch alle const, also offensichtlich nicht zuweisbar. Lassen Sie die const s:

using nodesfound = std::tuple<std::string, std::string, unsigned>; 

std::vector<nodesfound> nf; 
fill_vector(nf); 
std::sort(
    nf.begin(), nf.end(), 
    [](nodesfound const& n1, nodesfound const& n2) { 
     return std::get<2>(n1) < std::get<2>(n2); 
    } 
); 

Online Demo

+0

std :: sort mit Tupel arbeiten, warum das Innere des Tupels shoud sei const? Sortierung kann nur Tupel im Vektor tauschen? Thanck's viel – Fractale

+0

@perecastor: Sogar 'Swap' benötigt Zuweisung ... – ildjarn

0

andere Art und Weise Index der sortierten Elemente zu erhalten ist:

typedef std::tuple< const std::string, const std::string, const unsigned int> nodesfound; 
std::vector<nodesfound> nf; 
fil_vector(nf); 
std::vector<int> index(nf.size()); 
std::iota(index.begin(), index.end(), 0); 
std::sort(index.begin(), index.end(), [&](int n1, int n2) { 
    return std::get<2>(nf[n1]) < std::get<2>(nf[n2]); 
});