2015-08-22 7 views
0

Вот мой код. Я пропустил код для вектора, потому что это не было важно.Как найти максимальный элемент в векторе (C++)?

#include <string> 
#include <iostream> 
#include <vector> 
using namespace std; 


int main() { 
    vector<int> scores; 

    // code to make vector 

    cout << "High score: " << scores[std::max(scores.begin(), scores.end())] << endl; 
    system("pause"); 
} 

Это мое понимание того, что STD :: макс возвращает итератор, но я действительно не знаю, что делать с итератора. Я видел пример

*max(scores.begin(), scores.end()) 

, чтобы получить его, чтобы вернуть индекс вместо итератора, но получает ошибку

Expression: vector iterator not dereferencable 

Я попытался с помощью итератора, а затем с помощью зОго :: расстояния

vector<int>::iterator high = std::max(scores.begin(), scores.end()); 
cout << "High score: " << scores[std::distance(scores.begin(), high)] << endl; 

, но я получаю ошибку

Expression: vector subscript is out of range. 

Какой был бы лучший способ решить эту проблему?

+3

Вы используете функцию, коварно названную ['std :: max_element'] (http://en.cppreference.com/w/cpp/algorithm/max_element). 'std :: max' не делает то, что вы, кажется, думаете, что это так, как вы могли бы легко обнаружить, прочитав точное руководство. –

ответ

2

Существует стандартный алгоритм с именем std::max_element, объявленный в заголовке <algorithm>, который делает то, что вам нужно.

Например

#include <algorithm> 

//... 

cout << "High score: " << *std::max_element(scores.begin(), scores.end()) << endl; 

Предполагается, что вектор не является пустым.

Как для этого вызова

std::max(scores.begin(), scores.end()) 

затем возвращает максимальный итератор среди этих двух итераторов. Итератор, который соответствует end(), всегда больше или равен (если вектор пуст) итератор, который соответствует begin().

+0

Я пробовал это, но мой компилятор говорит: «У std нет участника max_element» – potapeno

+0

@potapeno Вы должны включить заголовок , как он уже написан в моем сообщении. –

+0

Nevermind, я не включил алгоритм ... что делает намного больше смысла – potapeno

0

Лучший способ заключается в использовании max_element:

vector<int> scores; 
//input 
vector<int>::iterator it; 
it=max_element(scores.begin(),scores.end()); 
cout<<*it; 

Если вы хотите максимальную без какого-либо беспокойства временной сложности вы также можете использовать это (не рекомендуется, хотя):

sort(scores.begin(),scores.end()); 
cout<<scores[scores.size()-1]; 

Вы должны используйте только первый способ!

Смежные вопросы