我正在尝试编写一个采用向量的函数,然后使用映射计算向量中每个元素的频率。具有最高频率的那些被推入一个新的向量,然后我试图返回要在我的main函数中输出的向量。
vector<double> mode(vector<double> v)
{
sort(v.begin(),v.end());
vector<double> modes;
map<int,double> frequencyCount;
for(size_t i; i<v.size(); i++)
frequencyCount[v[i]]++;
double current_max = 0;
for (auto iter = frequencyCount.cbegin(); iter != frequencyCount.cend(); ++iter)
{
if (iter ->second > current_max)
{
modes.push_back(iter->first);
current_max = iter->second;
}
}
if (current_max == 1)
{
cout << "No mode exists." << endl;
}
else
return modes;
}
然后我在main中调用它:
int main()
{
vector<double> m = mode(v);
cout << "Mode: ";
for (size_t i; i<m.size(); i++)
cout << m[i];
}
没有错误,但没有输出任何建议?
答案 0 :(得分:1)
for(size_t i; i<v.size(); i++)
您忘记将i
初始化为0.索引变量未初始化。未定义的行为。
此外,整体算法可以通过多种方式进行改进,但这不是我所要求的。
答案 1 :(得分:0)
好的,经过一些调整后,我也意识到我的逻辑是错误的。该函数在modes.push_back(iter->first)
迭代整个地图之前调用current_max
。所以我改变了循环以找到最大频率,然后再次遍历地图,从first
与second
匹配的每一对中打印出current max
。这是工作代码,以及主要功能。还有什么建议可以提高效率吗?
vector<double> mode(vector<double> v)
{
sort(v.begin(),v.end());
vector<double> modes;
map<double, int> frequencyCount;
for(size_t i = 0; i<v.size(); i++)
frequencyCount[v[i]]++;
double current_max = 0;
for (auto iter = frequencyCount.cbegin(); iter != frequencyCount.cend(); ++iter)
{
if (iter -> second > current_max)
{
current_max = iter->second;
}
}
for (auto it = frequencyCount.cbegin(); it != frequencyCount.cend(); ++it)
{
if (it -> second == current_max)
modes.push_back(it->first);
}
return modes;
}
和主要:
int main()
{
vector<double> v = input();
vector<double> m = mode(v);
cout << "Mode: ";
for (size_t i = 0; i<(m.size()-1); i++)
cout << m[i] << ", ";
cout << m[m.size()-1];
cout << endl;
return 0;
}