【问题标题】:Nested Map iterators嵌套 Map 迭代器
【发布时间】:2016-06-04 07:18:10
【问题描述】:

我有以下代码:

    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 和 BST。

【问题讨论】:

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


    【解决方案1】:

    变化:

    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!";
            }
        }
    }
    

    【讨论】:

    • 谢谢!这行得通!你对我如何设置这些数据结构有什么建议吗?这是否可以在月份地图中包含几天的 BST 并在每天的 BST 中包含一个向量?
    • 您的设计已损坏 IMO。太多的嵌套地图不是最好的选择。你应该重新考虑一个更好的方法。
    • 我已经考虑如何做到这一点大约 2 周了,这是我能从逻辑上想出的唯一解决方案,它使用 BST 和 Map 来存储这些数据。
    • 我已经稍微更新了我的代码,但遇到了更多问题。我决定将矢量全部丢弃,而是将其保留为包含月份地图的年份地图,该地图包含包含 WindData 对象 BST 的天地图,按时间排序。我的问题是插入
    • 无法读取代码 快速版:logTree lg; lg.插入(风速); ym[d.getYear()][d.getMonth()][d.getDay()] = lg;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多