2016-02-28 10 views
5

Używam std::max_element(vec), ale z tego, co wiem, zwraca najmniejszy indeks, jeśli dwa "największe" wskaźniki są równe.Jak znaleźć indeks największej wartości w wektorze, domyślnie większy indeks, jeśli istnieją dwa "największe" wskaźniki?

Przykład:

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

std::max_element(v) będzie odwoływać v[4], ale dla celów moim projekcie muszę go odwołać v[8] zamiast. Jaki byłby najlepszy sposób na zrobienie tego?

+1

'max_element' z' reverse_iterator's? (Czy piszesz pseudo-kod lub używasz już biblioteki zasięgu Erica Nieblera? Nie ma obecnie standardowego 'std :: max_element' używającego tylko' std :: vector'.) – BoBTFish

+0

Możesz wyszukiwać od pierwszego rezultatu . –

+0

@BoBTFish thanks! Zajrzę w to. – PanicSkittle

Odpowiedz

8

Można to wykorzystać

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

odnieść się do największego indeksu największej wartości.

Przykładowo

#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 << ' '; 
} 

tworzy wyjście

1 2 3 4 5 3 3 2 -1 

metodzie opisanej powyżej iteracyjnej powraca do tyłu, jak wskazano przez @BoBTFish. Aby dostać się do przodu iterator, można to zrobić:

#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 << ' '; 
} 

tworzy wyjście

1 2 3 4 5 3 3 0 -1 
      ^

Można zauważyć, że iterator it jest iterator do przodu.

+0

Pamiętaj, że to daje 'reverse_iterator' do elementu, który możesz przekonwertować z powrotem do" właściwego "typu iteratora (' std :: vector :: iterator'). Myślę, że poprawiłoby to twoją odpowiedź, jeśli pokażesz, jak to zrobić. – BoBTFish

4

To bardzo proste, aby utworzyć własną funkcję:

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

Można to zrobić zgodnie ze stylem standardowych algorytmów, biorąc "Komparator", który następuje po ściśle słabym porządku, a następnie używając 'if (! Cmp (* first, * max)) {max = first; } '. Chociaż standardowe algorytmy zwykle mają wersję nie pobierającą komparatora i domyślnie '' '(co nie jest całkiem takie samo jak domyślne' std :: less ', które może być wyspecjalizowane). – BoBTFish