C++11 - 计算数字向量中的模式时出错

C++11 - Error in calculating mode in a vector of numbers

我正在开发一个程序,给定输入文件中的值列表 (doubles),按升序对它们进行排序并计算 mode,然后打印结果在输出文件中。这是我到目前为止想到的。

它应该做的是将模式分配给向量的第 x 个元素,即为 current 产生更大值的元素,但是当我 运行 这个程序模式总是等于向量的最后一个元素。

我只是想不通自己犯了什么错误,因为在我看来这似乎是完全合乎逻辑的。

非常感谢任何帮助。

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <fstream>
using namespace std;

int main()
{
    ifstream iFile("inp.txt");
    if(!iFile)
    {
        cout << "Error input!" << endl;
        return -1;
    }

    ofstream oFile("out.txt");
    if(!oFile)
    {
        cout << "Error output!" << endl;
        return -1;
    }

    double data;
    vector<double> list;

    while(iFile >> data)
    {
        list.push_back(data);               //put the elements in a vector
        sort(list.begin(), list.end());     //and sort them in ascending order
    }

    for(int m = 0; m < list.size(); ++m)    //this is just
    {                                       //to verify
        oFile << list[m] << endl;           //that the elements
    }                                       //are listed in order

    int current = 0;
    int previous = 0;
    int mode = 0;
    for(int x = 0; x < list.size(); ++x)        //select an element of the vector
    {
        for(int y = 0; y < list.size(); ++y)    //match it against all the other elements of the vector
        {
            if(list[x] == list[y])              //if they're of equal value
            {
                ++current;                      //add 1 to variable "current"
            }
        }

        if(current > previous)                  //if "current" > "previous"
            {
                mode = list[x];                 //set the element "x" (from the first for) of the vector "list" to be the new mode
                current = previous;             //and set current to be the new previous    
            }

        current = 0;                            //reset current to 0
    }

    oFile << "\nmode: " << mode << endl;        //output "mode"

    return 0;
}

试试

previous = current;

而不是

current = previous;

在最后一个 ifprevious 永远为零和最后一个 x (当 y 等于 x 时与自身匹配)生成大于 previous(即零)的 current

OT:看这个while

while(iFile >> data)
{
    list.push_back(data);               //put the elements in a vector
    sort(list.begin(), list.end());     //and sort them in ascending order
}

无需在每次插入后都对向量进行排序。我建议您添加 list 输入文件的所有内容,然后对向量进行排序。只有一次,仅在最后一次插入之后。

类似

while(iFile >> data)
{
    list.push_back(data);  //put the elements in a vector
}

sort(list.begin(), list.end()); //and sort them only one time