使用map c ++查找向量的多个模式

时间:2016-02-18 00:42:09

标签: c++ dictionary vector

我正在尝试编写一个采用向量的函数,然后使用映射计算向量中每个元素的频率。具有最高频率的那些被推入一个新的向量,然后我试图返回要在我的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];
}

没有错误,但没有输出任何建议?

2 个答案:

答案 0 :(得分:1)

for(size_t i; i<v.size(); i++)

您忘记将i初始化为0.索引变量未初始化。未定义的行为。

此外,整体算法可以通过多种方式进行改进,但这不是我所要求的。

答案 1 :(得分:0)

好的,经过一些调整后,我也意识到我的逻辑是错误的。该函数在modes.push_back(iter->first)迭代整个地图之前调用current_max。所以我改变了循环以找到最大频率,然后再次遍历地图,从firstsecond匹配的每一对中打印出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;
}