嵌套的Map迭代器

时间:2016-06-04 07:18:11

标签: c++ csv dictionary vector binary-search-tree

我有以下代码:

    int main()
{
    typedef std::map<int,int> monthMap;
    typedef std::map<int,std::map<int, monthMap>> yearMap;


    //std::ifstream inputFile("MetData-31-3.csv");
    //std::ifstream inputFile("MetData_Mar01-2015-Mar01-2016-ALL.csv");
    //if(!inputFile) return -1;

    //readFile(inputFile, yearMap);
    int year = 2011, month = 4;
    yearMap ym;
    monthMap mm;
    ym[year][month];
    yearMap::iterator yearItr = ym.find(year);

    if(yearItr != ym.end())
    {
        //monthMap &mp = yearItr->second;
        monthMap::iterator monthItr;
        monthItr = (yearItr->second).find(month);
        if(monthItr != yearItr->second.end())
        {
            std::cout << "Found!";
        }
    }

}

基本上我要做的就是为我的项目设置基础,从CSV文件中读入,该文件包含数据中心的日期,时间,风速和辐射水平等信息。

我在其他项目中将所有内容都作为矢量工作但是我需要在项目中切换数据结构并实现BST和Map。

我的设计策略是这样的: 有一张年的地图 其中包含几个月的地图 其中包含BST的天数 其中包含WindData对象的向量 它包含所有元素,如风速,时间,辐射等。

首先,这是设置的最佳方式吗?在这个阶段,我真的无法想到另一种选择。

但我遇到的主要问题是如何实际迭代嵌套地图,我从这段代码中得到以下错误

D:\Projects\testProj\main.cpp|31|error: no match for 'operator=' (operand types are 'std::map<int, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const int, int> >}' and 'std::map<int, std::map<int, int> >::iterator {aka std::_Rb_tree_iterator<std::pair<const int, std::map<int, int> > >}')|

对于我来说,使用这种数据结构进行此类过程看起来非常笨重,丑陋和缓慢,但我需要这样做,我对任何存储和处理此方法的方法持开放态度给出的数据仍然使用MAP和&amp; BST。

1 个答案:

答案 0 :(得分:0)

变化:

monthMap::iterator monthItr;
monthItr = (yearItr->second).find(month);

要:

std::map<int, monthMap>::iterator monthItr;
monthItr = (yearItr->second).find(month);

然而,AAA会节省您的时间和精力:

int main(){
    typedef std::map<int,int> monthMap;
    typedef std::map<int,std::map<int, monthMap>> yearMap;

    int year = 2011, month = 4;
    yearMap ym;
    monthMap mm;
    ym[year][month];
    auto yearItr = ym.find(year);
    if(yearItr != ym.end()){
        auto monthItr = (yearItr->second).find(month);
        if(monthItr != yearItr->second.end())
        {
            std::cout << "Found!";
        }
    }
}