我已经为此苦苦挣扎了一段时间,我可以猜到这有点像我使用size_type或函数的方式,但是只要我有一个均匀的输入并且试图找到中位数,程序就会将两个中间值相除,并输出一个截断的数字而没有我需要的十进制数字。
该程序旨在获取字符串映射,并将其分配给双精度向量的值。这样一来,您就可以跟踪在同一键下输入的数字。
我还添加了控制台外观的图片。从输出中,我希望中位数为5.5。
我尝试过将所有物体都铸造成单独漂浮的形状,但这也没有消除它。我怀疑它与size_type数据类型的结构有关,但我不确定。
主要
#include "Util.h"
#include <iostream>
#include <list>
#include <string>
#include <map>
#include <vector>
typedef std::map<std::string, std::vector<double>>::iterator mapStrVectorIt;
int main()
{
std::map<std::string, std::vector<double>> dict;
double x;
std::string str;
Util util;
//Take in the inputs from the user in the format: string double, add the double to the respective vector
while (std::cin >> str >> x) {
dict[str].push_back(x);
}
//Outputs each key and the value/s associated with it
for (mapStrVectorIt it = dict.begin(); it != dict.end(); ++it)
{
std::cout << (*it).first << ": ";
std::vector<double> itVector = (*it).second;
for (auto i = itVector.cbegin(); i != itVector.cend(); ++i)
{
std::cout << *i << " ";
}
std::cout << '\n';
}
std::cout << '\n' << "-----------------------------------------------------------------" << '\n';
//Looks through every single vector in the map and calculates the median
for (mapStrVectorIt it = dict.begin(); it != dict.end(); ++it)
{
std::vector<double> itVector = (*it).second;
std::cout << '\n';
std::cout << (*it).first << ": median = " << util.median(itVector);
std::cout << '\n';
}
}
实用程序
#ifndef GUARD_stats_h
#define GUARD_stats_h
#include <vector>
#include <algorithm>
#include <iostream>
class Util
{
public:
Util() {};
int median(std::vector<double>& v);
};
#endif
Util.cpp
#include "Util.h"
int Util::median(std::vector<double>& v) {
typedef std::vector<double>::size_type sizeT;
sizeT size = v.size();
if (size == 0)
{
return 0; // Undefined, really.
}
else if (size == 1)
{
return *(v.begin());
}
else
{
std::sort(v.begin(), v.end());
if (size % 2 == 0)
{
std::cout << " even ";
return (v[size / 2 - 1] + v[size / 2]) / 2;
}
else
{
return v[size / 2];
}
}
}
答案 0 :(得分:1)
就像内森·皮尔森(Nathan Pierson)亲切提到的那样,中位数被声明为int返回类型...