Ошибка "Выражение: векторный итератор не подлежит исправлению"
Следующий код вводит слова и подсчитывает, сколько раз каждое слово появилось на входе. Затем программа печатает каждое слово и соответствующую частоту в порядке от самого низкого до самого высокого.
#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;
}
До сих пор не знаю, почему "пока" Лоо [не работает.