从地图

时间:2017-05-14 08:13:51

标签: c++ csv dictionary

我想从我添加到地图中的typedef struct变量中检索速度的第一个值。现在我的代码正在返回我读过的CSV文件中的所有值。如何让它只返回第一个值来进行比较以获得整个列的最大值?

我尝试使用map.begin()->((*it).second).speed),但它不起作用。

#include <iostream>
#include <fstream>
#include <string>
#include "Date.h"
#include "Time.h"
#include <stdlib.h>

#include <map>


using namespace std;

typedef struct
{

Time t;
float speed;
int solar;

 }
WindLogType;

date d;
multimap<date, WindLogType> windlog;
ifstream input , csv;
ofstream output;
string filename;
int number,choice;
string *filelist = NULL;
WindLogType T1;


int main()
{
output.open("data/met_index.txt");

cout << "Enter number of file to read : " << endl;
cin >> number ;

for(int i =0; i< number ; i++)
{
    cout << "Enter File name : " << endl;
    cin >> filename;
    output << filename << endl;
}
filelist = new string[number];

output.close();

input.open("data/met_index.txt", ios::in);
if(!input.is_open())
{
    cout<< "File not found."<<endl;
    return 0;
}
else
{
    string line, line2;
    while(getline(input, line, '\n'))
    {
        //cout << line << endl;
        line = "data/" + line;
        for(int i =0; i<number; i++)
        {
            filelist[i] = line;
            cout << filelist[i];
            csv.open(filelist[i].c_str());

            string line,sDay, sMonth, sYear, sHH, sMM;

            while(getline(csv,line2, '\n' ))
            {
                //cout << line2 << endl;
                getline(csv, sDay,'/');
                getline(csv, sMonth,'/');
                getline(csv, sYear,' ');
                getline(csv, sHH,':');
                getline(csv, sMM,',');
                int day1 = atoi(sDay.c_str());
                int month1 = atoi(sMonth.c_str());
                int year1 = atoi(sYear.c_str());
                int hour1 = atoi(sHH.c_str());
                int min1 = atoi(sMM.c_str());

                float s1 = 0.0;
                int sr = 0;
                for (int i=0; i<10; i++)
                {
                    csv >> s1;
                    csv.ignore(100, ',');
                }
                for(int j =0; j<18; j++)
                {
                    csv >> sr;
                    csv.ignore(50,',');
                }

                T1.t.setTime(hour1, min1);
                T1.speed = s1;
                T1.solar = sr;

                d.setDate(day1, month1, year1);
                windlog.insert(pair<date, WindLogType>(d, T1));

                multimap<date, WindLogType> :: iterator it;
                for(it =windlog.begin(); it!= windlog.end(); ++it)
                {
                    int max_value = ((*it).second).speed;
                    if((*it).second.speed > max_value){
                        max_value = ((*it).second).speed;
                    }
                    cout << max_value<<endl;
                }
            }
            csv.close();
        }
        /**/
    }
    input.close();
    input.clear();
    //input.open(filelist[0].c_str(), ios::in);
}
return 0;
}

1 个答案:

答案 0 :(得分:1)

您每次都在打印max_value

在插入所有内容后,即在csv.close()之后移动找到最大值的行。此外,在搜索它时,不要打印最大值,但是在迭代完所有元素之后。

multimap<date, WindLogType> :: iterator it =windlog.begin();
int max_value = ((*it).second).speed;
for(++it ; it!= windlog.end(); ++it)
{
    if((*it).second.speed > max_value){
        max_value = ((*it).second).speed;
    }
}
cout << max_value<<endl;

当然,请确保地图不是空的。

修改

WindLogType.speed是一个浮点数,你在找到最大值时使用整数,它也应该是浮点数。可能你已经知道了,但是从C ++ 11开始,你可以使用auto说明符让编译器根据赋值表达式自动推导出正确的类型。它从Visual Studio 2010和gcc 4.4开始可用(对于gcc,您必须包含--std=c++11选项)。

if (!windlog.empty()) {
  auto it = windlog.begin(); // 'it' is an iterator
  auto max_value = it->second.speed; // you're now sure it uses the same type
  for(++it; it!= windlog.end(); ++it) {
    max_value = std::max(it->second.speed, max_value);
  }
  std::cout << max_value << std::endl;
} else {
  std::cout << "Empty map" << std::endl;
}