2012-03-09 2 views
0

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

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

#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-> первый, i-> второй, я думаю. Может кто-нибудь помочь мне узнать, что может быть проблема. Также, если вы можете предложить некоторые альтернативные форумы C++, которые также будут полезны.

ответ

3

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

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 точки «за конец " вашего карточного контейнера.

+0

Извините, я не обращал достаточного внимания на возврат r.second> 42, когда число> 41, а не inputno.> 42. Я просто небрежно прочитал алгоритм правильно. Извини за это. Спасибо за ваш ответ, sirgeorge. – Mahesh

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