【问题标题】:finding elements of set in a map在地图中查找集合的元素
【发布时间】:2012-05-20 21:33:15
【问题描述】:

我有两张地图,tk1tk2,结构如下:

std::map<std::string, double>tk1;
std::map<std::string, double>tk2;

tk1 包含以下数据:

    2011-01-03 2200
    2011-01-04 2209
    2011-01-05 2300

tk2 包含以下数据:

2011-01-03 2450
2011-01-04 2465
2011-01-06 2476
2011-01-07 2457

我创建了一个集合,其中包含日期作为字符串,如

std::set<std::string>dateset;
std::set<std::string>new_dateset;

我通过遍历 2 个地图并插入到集合中来创建它

dateset.insert(it->first);

dateset 具有以下值:

2011-01-03
2011-01-04
2011-01-05
2011-01-06
2011-01-07

我想填充 new_dateset,使其仅包含 tk1tk2 中的日期,即 new_dateset 应仅包含

2011-01-03
2011-01-04

我写了以下内容:

std::set<std::string>::iterator it1=dateset.begin(), end1=dateset.end();
std::map<std::string, double>::iterator it2=tk1.begin(), end2=tk1.end();
std::map<std::string, double>::iterator it3=tk2.begin(), end3=tk2.end();
while (it1 != end1) {
if (it2->first == *it1) 
new_dateset.insert(it2->first);
++it1;
}

但显然我做得不对。有人可以建议最好的方法吗?

【问题讨论】:

    标签: c++


    【解决方案1】:

    您可以考虑将std::set_intersectionkey_iterator 中的previous answer 结合使用。

    【讨论】:

    • 日期是std::map的键,所以它们已经排序了。
    • 好点——我有点知道,然后我的记忆停止工作,我编辑了“如果你能依赖...”,尽管它没有任何真正意义.谢谢你提醒我现实! :-)
    【解决方案2】:

    遍历it1,使用find()方法检查每个元素的first是否在tk2中,如果存在则将其插入集合中。您在示例中所做的是检查 dataset 中的元素,其中包含 tk1tk2 中的键。

    for(; it2 != end2; ++it2) {
      if(tk2.find(it2->first) != end3) new_dataset.insert(it2->first);
    }
    

    【讨论】:

      【解决方案3】:

      您应该按如下方式比较字符串:

      if(it2->first.compare(*it) == 0)
      {
        //strings match, do something.
      }
      else
      {
        // no match do something else.
      }
      

      【讨论】:

      • 为什么?它比普通的 == 更冗长,更不清晰,在这里做同样的事情。
      【解决方案4】:

      遍历 tk1 中的元素并查看键是否存在于 tk2 中。如果是,则插入。

      for(; it2 != end2; ++it2)
      {
        if(tk2.find(it2->first) != end3)
        {
          new_dataset.insert(it2->first);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-22
        • 2020-04-12
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        相关资源
        最近更新 更多