我有一个程序,我必须在整数列表中找到最常见的元素。我使用下面的程序执行此操作,但问题是,我怀疑擦除函数与countRepetition()
函数中的迭代器增量混淆。我的问题是如何解决问题,或者这不是问题是什么?
提前致谢。
答案 0 :(得分:4)
你有几个问题。首先,正如您所怀疑的那样,是erase
的错误使用。擦除迭代器时,它会使迭代器无效。之后对迭代器的任何使用都是未定义的行为。由于erase
返回下一个有效的迭代器,你可以做的是重构循环,如
for (START = l.begin(); START != l.end();) { // do not increment here
if (*START) {
counter++;
START = l.erase(START); // erase and get next
}
else
{
++START; // go to next
}
}
所以现在至少你在列表中循环。不幸的是,main
中仍然会有一个无效的迭代器。您将START
从main
传递给countRepetition
,当从列表中删除该迭代器时,您将拥有一个无效的迭代器。你需要做的是每次迭代从列表中获取一个新的begin
迭代器,因为你总是擦除第一个元素。这会使你的for循环看起来像
for (START = l.begin(); START != l.end(); START = l.begin()) {
m.push_back(countRepetition(START));
}
另一个问题是你只是检查角色是不是0
。如果要计算重复次数,则需要确保检查迭代器是否为相同的字符。我会留给你实施。
我还想指出有一种更简单的方法可以做到这一切。 std::map
可让您轻松构建直方图。将其与std::max_element
相结合,您可以将整个程序编写为
int main()
{
std::map<char, int> histogram;
while ('0' != (number = getchar()))
++histogram[number]; // add to map, increment count of occurances
auto most_frequent = *std::max_element(histogram.begin(),
histogram.end(),
[](const auto& lhs, const auto& rhs) { return lhs.second < rhs.second; }).first;
std::cout << most_frequent;
return 0;
}
答案 1 :(得分:0)
这可能就是你要找的东西:
#include <iostream>
#include <list>
#include <vector>
#include <map>
using namespace std;
list <char> l;
map<char, int> ans;
int main()
{
char c;
do{
c = getchar();
l.push_back(c);
}while(c != '0');
for(auto chr: l){
ans[chr]++;
}
char ch;
int mx = 0;
for(auto k: ans){
if(k.second > mx)
{
ch = k.first;
mx = k.second;
}
}
cout<<ch<<" : "<<mx;
}
答案 2 :(得分:0)
您的问题是您到处使用全局变量。 全局START在两个循环中更改,因此您只访问第一个循环,然后在第二个函数中再次更改,并且您不会再次执行第一个循环。
为什么使用全局变量?你不应该使用它们,而是使用局部变量。