Ошибка "Выражение: векторный итератор не подлежит исправлению"

Следующий код вводит слова и подсчитывает, сколько раз каждое слово появилось на входе. Затем программа печатает каждое слово и соответствующую частоту в порядке от самого низкого до самого высокого.

#include <iostream>
#include <map>
#include <vector>
#include <string>

using namespace std;

int main()
{
    string s;
    map<string, int> counters;
    map<int, vector<string> > freq;

    while (cin >> s)
        ++counters[s];

    map<string, int>::const_iterator it = counters.begin();
    for (it; it != counters.end(); ++it)
    {
        freq[it->second].push_back(it->first);
    }

    for (map<int, vector<string> >::const_iterator i = freq.begin();
        i != freq.end(); ++i)
    {
        vector<string>::const_iterator j = i->second.begin();
        cout << i->first << '\t' << *j;
        while (j != i->second.end())
        {
            ++j;
            cout << ", " << *j;
        }
        cout << endl;
    }   

    return 0;
}

Программа компилируется и запускается, но всякий раз, когда я ввожу все нужные слова и ввожу EOF, появляется следующая ошибка во время выполнения

Выражение: векторный итератор не разыменовывается

а затем появляется следующая ошибка

Стандартные библиотеки C++ вне диапазона && 0

Как это решить?

2 ответа

Я думаю, это потому, что вы разыменовываете j когда это может указывать на end:

    cout << i->first << '\t' << *j;
                                ^----- HERE

И вот изменение, чтобы исправить это:

    if (j != i->second.end()) {
        cout << i->first << '\t' << *j;
    }

Понял.

#include <iostream>
#include <map>
#include <vector>
#include <string>

using namespace std;

int main()
{
    string s;
    map<string, int> counters;
    map<int, vector<string> > freq;

    while (cin >> s)
        ++counters[s];

    map<string, int>::const_iterator it = counters.begin();
    for (it; it != counters.end(); ++it)
    {
        freq[it->second].push_back(it->first);
    }


    for (map<int, vector<string> >::const_iterator i = freq.begin();
        i != freq.end(); ++i)
    {
        vector<string>::const_iterator j = i->second.begin();
        cout << i->first << '\t';
        for (j; j != i->second.end(); ++j)
            cout << *j << " ";

        cout << endl;
    }   

    return 0;
}

До сих пор не знаю, почему "пока" Лоо [не работает.

Другие вопросы по тегам