Исключение: STATUS_ACCESS_VIOLATION - ссылка на указатель - PullRequest
0 голосов
/ 09 марта 2012

Я только запускаю немного C ++ (то есть после 10 лет JAVA!). Я следую за примерами из книги Stroupstrup.

Я собрал следующие фрагменты кода из его книги.

#include <iostream>
#include <map>
#include <string>
#include <iterator>
using namespace std;

map<string, int>histogram;
void record (const string &s)
{
    histogram[s]++; //record frequency of "s"
    cout<<"recorded:"<<s<<" occurence = "<<histogram[s]<<"\n";
}

void print (const pair<const string, int>& r)
{
    cout<<r.first<<' '<<r.second<<'\n';
}

bool gt_42(const pair<const string, int>& r)
{
    return r.second>42;
}

void f(map<string, int>& m)
{
    typedef map<string, int>::const_iterator MI;
    MI i = find_if(m.begin(), m.end(), gt_42);
    cout<<i->first<<' '<<i->second;
}

int main () {
    istream_iterator<string> ii(cin);
    istream_iterator<string> eos;
    cout<<"input end\n";

    for_each(ii, eos, record);

    //typedef pair <string, int> String_Int_Pair;
    //histogram.insert(String_Int_Pair("42", 1));
    //histogram.insert(String_Int_Pair("44", 1));


    //for_each(histogram.begin(), histogram.end(), print);
    f(histogram);

}

Я получаю ошибку - Исключение: STATUS_ACCESS_VIOLATION, я думаю, что в ссылках i-> first, i-> second, я полагаю. Может ли кто-нибудь помочь мне выяснить, в чем проблема? Также, если вы можете предложить несколько альтернативных форумов C ++, которые также будут полезны.

1 Ответ

3 голосов
/ 09 марта 2012

В вашей функции void f(map<string, int>& m) вы не проверяете, действительно ли вы нашли искомый элемент, например:

void f(map<string, int>& m)
{
    typedef map<string, int>::const_iterator MI;
    MI i = find_if(m.begin(), m.end(), gt_42);
    if(i != m.end())
       cout<<i->first<<' '<<i->second;
    else
       cout << "Not Found" << endl;
}

Ошибка, вероятно, возникает при доступе к i->first, когда i указывает "за конец" контейнера вашей карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...