【问题标题】:How to iterate over multiple maps and get their values? - C++如何遍历多个地图并获取它们的值? - C++
【发布时间】:2020-06-09 04:46:22
【问题描述】:

所以我有 3 个多图,它们都具有相同的键(在本例中为日期),并且它们代表的值对于每个映射都不同。我知道如何创建一个迭代器并迭代一个映射,然后使用该迭代器获取该映射的值。但是,我将如何遍历所有 3 个地图并将它们的值放入我需要的变量中?我很困惑,因为如果我使用一个迭代器来迭代所有 3 个映射,那么该迭代器只会给我创建迭代器的映射的值,而且我觉得为此创建 3 个 for 循环有点太多了。有什么想法吗?

    multimap<Date, float> mapOption4WindSpeed;
    multimap<Date, float> mapOption4Temperature;
    multimap<Date, double> mapOption4Solar;


    cout << "Please enter year (xxxx): " << endl;
    cin >> year;

    Date newDate;
    newDate.SetDay("1");
    newDate.SetDay("1");
    newDate.SetDay(year);

    for(int i = 0; i < SIZE; i++)
    {
        mapOption4WindSpeed.insert(make_pair(windlog[i].d, windlog[i].speed.GetSpeed()));
        mapOption4WindSpeed.insert(make_pair(windlog[i].d, windlog[i].temp.GetTemperature()));
        mapOption4Solar.insert(make_pair(windlog[i].d, windlog[i].solar.GetSolar()));
    }

    multimap<Date, float>::iterator itS = mapOption4WindSpeed.find(newDate);
    multimap<Date, float>::iterator itT = mapOption4Temperature.find(newDate);
    multimap<Date, double>::iterator itSol = mapOption4Solar.find(newDate);

    for(int i = 0; i < SIZE; i++) //Loop through entire array to check if the input matches the year
    {

        if(itS != mapOption4WindSpeed.end()) //This statement and the above is where I am confused
        {

            //Bunch of operations in here

        }

我的结构:

typedef struct
{

    Date d;
    Time t;
    Weather speed;
    Weather solar;
    Weather temp;

} WindLogType;

然后我使用结构体的 Vector 来访问值:

Vector<WindLogType> windlog;

【问题讨论】:

  • 我对你想要做什么感到有点困惑。您正在执行.find 以检查newDate 是否在地图中。究竟是什么循环?
  • 我很抱歉,这只是我正在进行的工作,你可以假设我基本上被困在试图找出如何循环遍历 3 个地图而不是 1 个地图的值。我想这样做的原因, 是因为 3 个映射中的每一个都具有完全相同的键,因此大小也相同,但是它们保存的值不同,我想遍历映射并在同一个循环中从每个映射中检索值。希望这是有道理的
  • 但我不确定你为什么需要一个循环。假设查找成功,itS-&gt;second 将为您提供风速。
  • 我需要一个循环,因为我的文件中有重复的日期值(因此是多图),它们都有不同的对应值。通常,我通过为特定地图创建迭代器并在该地图上循环来循环,但现在,我无法创建单个迭代器来循环所有 3 个地图,因为该迭代器只会为我创建它的地图提供值。不会吗?

标签: c++ maps


【解决方案1】:

所以我有 3 个多图,它们都具有相同的键(在本例中是日期),并且它们代表的值对于每个映射都不同。

除非您有非常充分的理由使用三个multimaps,否则我建议您创建一个multimap

struct MyData
{
   float windSpeed;
   float temperature;
   double solar;
};

std::multimap<Date,  MyData> mapOfMyData;

这将使访问与Date 对应的所有数据变得容易。

【讨论】:

  • 如果把所有的信息综合起来,怎么知道multimap中是否存在一对(数据,温度)?
  • 在尝试使用地图之前,我有一个结构(我现在将在我的问题中包含它),然后我创建了这个结构的向量。所以我正在使用结构的这个向量访问值。那时我可以将整个 Vector 包含到我的地图中吗?我怎么能这样做?
  • @madhur4127,给定一个键,你可以找出地图是否包含任何带有该键的元素。您可以使用std::multimap::lower_boundstd::multimap::upper_bound 来迭代它们。
  • @thedafferg map&lt;Date, vector&lt;struct&gt;&gt; my_map 可以。你可以通过my_map[date].push_back(...)添加到这里。
  • 当我这样声明 multimap&lt;Date, Vector&lt;struct&gt;&gt; testMap; 时,我得到错误模板参数 1 和 2 无效。请注意,Vector 是一个自定义类,它只是封装了 std::vector,所以这不是原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2020-10-31
  • 2020-07-07
  • 2011-10-08
相关资源
最近更新 更多