2015-02-23 3 views
-3
#include<vector> 
#include<algorithm> 
#include<iostream> 
using namespace std; 

int main() { 
    map<int, int> score; 
    int n; 
    cin >> n; 
    while(n--){ 
     int a,b; 
     cin >> a >> b; 
     score[a] = score[a] + b; 
    } 
    cout << score.rbegin()->first << " " << score.rbegin()->second << endl; 
    return 0; 
} 

сообщение об ошибке 16254 segmentation fault :: 11. Код выхода: 139. И не могли бы вы объяснить, почему при использовании контейнера карты часто возникала ошибка сегментации.Почему у меня есть ошибка сегментации в этой небольшой программе?

+0

Какой вклад вы используете для запуска программы? –

+2

Оценка 'score [a]' дважды, безусловно, неэффективна, и я не уверен на 100%, что она хорошо определена (хотя я уверен, что есть достаточно последовательности, чтобы уйти от нее). Я бы написал «score [a] + = b;' –

+0

@MikeSeymour Не стандартно ли гарантировать, что для присваивания сначала будет оцениваться rhs? Возможно, я читаю это неправильно, но вот что я нашел: «Побочный эффект (модификация левого аргумента) встроенного оператора присваивания и всех встроенных операторов присваивания упорядочен после вычисления значения (но а не побочные эффекты) как левого, так и правого аргументов, и секвенируется перед вычислением значения выражения присваивания (то есть перед возвратом ссылки на модифицированный объект) « –

ответ

2

Если n является 0, вы никогда не заполнить score, а затем перейти к доступу к элементу из score без проверки, если он пуст.

В общем, всегда доказывайте, что итератор действителен до его использования.