2016-08-12 3 views
0
vector<tuple<int, int,char>> array; 
    for(int i=0;i<m-1;i++) 
    { 
     long long int p; 
     cin>>p; 
     get<0>(x)=p;//updated value 
     get<1>(x)=get<0>(x);//real value 
     get<2>(x)='v'; 
     array.push_back(x); 
    } 
    sort(array.begin(),array.end()); 
    reverse(array.begin(),array.end()); 
    //how to get the maximum of the second field 
    //to to element with largest first field 
    //and then delete the tuple 

glaube, ich habe ein Array von Datentyp Tupel als int, int, char, beispielsweise (5,5 h), (5,2, H), (5,7, v), (3,1, h); (3,7, h); (1,1, v). Es ist bereits in absteigender Reihenfolge nach dem ersten Wert sortiert, Jetzt möchte ich den Teil finden, der größten ersten Wert mit größten zweiten Wert enthält? Also muss ich nur in den ersten drei Teilen suchen. Gibt es eine Möglichkeit, max() hier oder andere STL-Funktionen zu verwenden?Wie findet man den Maximalwert in einem Vektor von Tupeln?

+1

Von verwenden kann, was ich sehe , Sie haben nicht nur nach dem ersten Wert sortiert; Du hast das ganze Tupel sortiert. Ist das nicht so? –

Antwort

1

std::tuple::operator < führt einen lexikografischen Vergleich (Cplusplus.com). Das heißt, dass nach sort und reverse der 0ste Punkt den tuple mit dem größten dritten Element unter allen Tupeln mit dem größten zweiten Element unter allen Tupeln mit dem größten ersten Element enthält, was Sie brauchen.

Also, einfach zurück array[0].

0

ITNOA

Hallo,

Wenn Sie nicht wollen, dritte Tupelelement in Kompression verwendet, und Sie nicht sortieren verwenden möchten und Funktionen umkehren.

Also ich denke, ist eine gute Wahl std::max_element mit Lambda zu verwenden, wie unten

typedef tuple<int, int,char> ET; 

auto comparator = [](ET a, ET b) 
{ 
    return std::tie(get<0>(a), get<1>(a)) < std::tie(get<0>(b), get<1>(b)) 
} 
0

Als Standard operator < ist gut, Sie einfach

const std::vector<std::tuple<int, int, char>> tuples = // ... 

auto it = std::max_element(tuples.begin(), tuples.end()); 

Demo

Verwandte Themen