2016-02-28 8 views
5

Sto usando std::max_element(vec), ma da quello che posso dire, restituisce l'indice più piccolo se due "più grandi" indici sono uguali.Come posso trovare l'indice del valore più alto in un vettore, in modo predefinito sull'indice più grande se ci sono due indici "maggiori"?

Esempio:

vector<int> v = {1, 2, 3, 4, 5, 3, 3, 2, 5}; 

std::max_element(v) avrebbe riferimento v[4], ma ai fini del mio progetto ho bisogno di fare riferimento v[8] invece. Quale sarebbe il modo migliore per farlo?

+1

'max_element' con' reverse_iterator's? (Stai scrivendo pseudo-codice o stai già utilizzando la libreria di gamma di Eric Niebler? Non esiste attualmente lo standard 'std :: max_element' che prende solo un' std :: vector'.) – BoBTFish

+0

Puoi cercare dal primo risultato ottenuto . –

+0

@BoBTFish grazie! Vedrò questo. – PanicSkittle

risposta

8

È possibile utilizzare questo

max_element(v.rbegin(), v.rend()); 

per fare riferimento al più grande indice del più grande valore.

Ad esempio,

#include "iostream" 
#include "vector" 
#include "algorithm" 
using namespace std; 

int main() 
{ 
    vector<int> v = {1, 2, 3, 4, 5, 3, 3, 2, 5}; 
    *max_element(v.rbegin(), v.rend())=-1; 
    for (auto i: v) cout << i << ' '; 
} 

produce uscita

1 2 3 4 5 3 3 2 -1 

Il metodo di cui sopra restituisce un iteratore inverso, come sottolinea @BoBTFish. Per ottenere un iteratore in avanti, si potrebbe fare questo:

#include "iostream" 
#include "vector" 
#include "algorithm" 
using namespace std; 

int main() 
{ 
    vector <int> v = {1, 2, 3, 4, 5, 3, 3, 2, 5}; 
    reverse_iterator < vector <int> :: iterator > x (max_element(v.rbegin(), v.rend())); 
    vector <int> :: iterator it=--x.base(); // x.base() points to the element next to that pointed by x. 
    *it=-1; 
    *--it=0; // marked to verify 
    for (auto i: v) cout << i << ' '; 
} 

produce un output

1 2 3 4 5 3 3 0 -1 
      ^

Si può notare che l'iteratore it è un iteratore in avanti.

+0

Tieni presente che questo ti dà un 'reverse_iterator' sull'elemento, che potresti voler riconvertire con il tipo di iteratore" corretto "(' std :: vector :: iterator'). Penso che migliorerebbe la tua risposta se dimostrassi come farlo. – BoBTFish

4

E 'molto facile fare la propria funzione:

/* Finds the greatest element in the range [first, last). Uses `<=` for comparison. 
* 
* Returns iterator to the greatest element in the range [first, last). 
* If several elements in the range are equivalent to the greatest element, 
* returns the iterator to the last such element. Returns last if the range is empty. 
*/ 

template <class It> 
auto max_last(It first, It last) -> It 
{ 
    auto max = first; 
    for(; first != last; ++first) { 
     if (*max <= *first) { 
      max = first; 
     } 
    } 
    return max; 
} 
+0

Si potrebbe fare in modo che questo segua lo stile degli algoritmi standard prendendo un 'Comparator' che segue un rigoroso ordine debole, quindi usando' if (! Cmp (* first, * max)) {max = first; } '. Sebbene gli algoritmi standard in genere abbiano una versione che non accetta un comparatore e che esegue il default su '<' (che non è esattamente la stessa cosa di default a 'std :: less ', che può essere specializzato). – BoBTFish

+0

Un tipo è più probabile che supporti '<' di '<='. E '<=' può essere implementato in termini di '<': 'a <= b' è uguale a' (a Trovare il valore più alto in un'enumerazione

  • 2. modo più rapido per trovare il valore più grande ennesima in una matrice NumPy
  • 3. Trovare il flag impostato più alto in un valore enum
  • 4. Finding valore più grande in un dizionario
  • 5. Trovare più elementi in un vettore
  • 6. Trovare l'ordine più alto 1 in un primitivo Java
  • 7. Trova indici di più valori massimi in un vettore
  • 8. algoritmo per trovare il più grande calo in un array
  • 9. Indice di ritorno del valore più alto in un array
  • 10. grande valore da due o più campi
  • 11. Corrispondenza di una sequenza in un vettore più grande
  • 12. Pandas secondo più grande del valore
  • 13. Un modo pietonico come trovare se un valore si trova tra due valori in una lista
  • 14. Un buon modo per ottenere la chiave del valore più alto di un dizionario in C#
  • 15. Come trovare il vettore più vicino in {0,1,2}^12, più e più volte
  • 16. Come trovare il valore più alto di una colonna in un frame di dati in R?
  • 17. In Ruby, qual è il modo più pulito per ottenere l'indice del valore più grande in un array?
  • 18. Come trovare il 1 °, 2 °, 3 ° valore più alto in un elenco in Python
  • 19. Indice di ritorno del valore più piccolo in un vettore?
  • 20. SQL - Come trovare il numero più alto in una colonna?
  • 21. Come posso trovare il più grande (in dimensione) di due tipi interi?
  • 22. Il più grande divisore in modo tale che due numeri siano divisi intorno allo stesso valore?
  • 23. Modo efficiente per trovare la chiave più grande in un dizionario con valore diverso da zero
  • 24. Come impostare il valore predefinito di un campo di ordinazione +1 del valore più alto in Django
  • 25. Come posso trovare la più grande sottostringa comune tra due stringhe in PHP?
  • 26. trovare il valore più alto all'interno di livelli di fattore
  • 27. perché ci sono più fcntl.h in linux?
  • 28. Trovare gli elementi più comuni in un vettore in R
  • 29. mongodb: trovare il valore numerico più alto di una colonna
  • 30. Ordine SQL dal valore più alto di due colonne