2017-02-08 16 views
5

У меня есть реализация карты, где идентификатор хранится как значение и помечен как ключ. Это позволяет мне использовать автоматическую сортировку на картах и ​​позволяет идентифицировать идентификатор элемента с наивысшими отметками.Разница между rbegin и конечной функцией в стандартной библиотеке

for(map<int, int>::iterator i = marks.begin(); i != marks.end(); ++i) 
    cout << i->first << "\t" << i->second << endl; 
cout << marks.rbegin()->second << endl; 
cout << marks.end()->second << endl; 

производит этот выход:

312 3 
420 4 
512 2 
752 1 
1 
420 

Последовательность ввода была порядке возрастания значений. Почему end() не отображает «1», но вместо этого отображает клавишу последней введенной пары? В чем разница между rbegin() и end()?

+3

Это не относится к вопросу, но не используйте 'std :: endl', если вам не нужен дополнительный материал, который он делает. '' \ n'' заканчивает линию. –

+1

Что касается вашего запроса на форматирование отзывов: см. Мои изменения :-) Не используйте изображения текста. – Angew

ответ

12

rbegin фактически является последним элементом вашего контейнера. end является минута конец контейнера.

Таким образом, marks.end()->second - это неопределенное поведение.

+0

Ах! Что объясняет его. Благодаря! – Naman

+1

Кроме того, 'rbegin()' и 'rend()' возвращают обратный итератор, который [работает назад по сравнению с обычными итераторами] (http://coliru.stacked-crooked.com/a/8fcf0408635e5cc8). –