这是我对一个返回int
数组的模式(最常见元素)的函数的可怕尝试。
标题中提到的错误在代码中被注释掉了。
我的理解是map
由pairs
组成,所以我不知道问题是什么。
#include <iostream>
#include <map>
int mode(int* arrPtr, int size) {
assert (size > 0);
std::map<int,int> M;
for (int k = 0; k < size; ++k)
M[*(arrPtr + k)]++;
std::pair<int,int> maxpair(M.begin()->first, M.begin()->second);
for (std::map<int,int>::iterator it = M.begin() + 1; it < M.end(); ++it)
if (it->second > maxpair->second) maxpair = *it; // ERROR HERE
return maxpair->second;
}
int main() {
int myArray[] = {1, 4, 5, 59, 1, -1, 4, 9, 1, 1, 9, -40};
return 0;
}
此外,还有一种更好的方法可以做到这一点。 C ++大师将如何做到这一点?
答案 0 :(得分:2)
替换:
if (it->second > maxpair->second)
使用:
if (it->second > maxpair.second)
如果您查看自己的计划,maxpair
类型为std::pair<int, int>
does not operator->
已超载。
您尝试访问的是成员对象second
,因此您应该使用maxpair.second
。
答案 1 :(得分:1)
迭代器的作用基本上就像一个指针,这就是你使用的原因 - &gt;在上面。您的std :: pair是一个值,因此您应该使用.
而不是->
。
尝试:
if (it->second > maxpair.second) maxpair = *it;
P.S。由于复制对象所涉及的开销,maxpair = *它的分配可能很慢。如果你想要速度,最好将值存储为简单整数而不是成对对象。
P.P.S。如果您正在尝试找到该模式,那么您是否真的想要具有最大计数的值,而不是计数?