3

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

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 所以它只包含两个tk1和中的日期tk2,即 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;
}

但显然我没有正确地做到这一点。有人可以建议最好的方法来做到这一点。

4

4 回答 4

3

您可能会考虑std::set_intersection使用以前key_iterator答案

于 2012-05-12T17:14:42.647 回答
1

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

for(; it2 != end2; ++it2) {
  if(tk2.find(it2->first) != end3) new_dataset.insert(it2->first);
}
于 2012-05-12T17:04:35.973 回答
0

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

if(it2->first.compare(*it) == 0)
{
  //strings match, do something.
}
else
{
  // no match do something else.
}
于 2012-05-12T17:03:37.630 回答
0

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

for(; it2 != end2; ++it2)
{
  if(tk2.find(it2->first) != end3)
  {
    new_dataset.insert(it2->first);
  }
}
于 2012-05-12T17:06:49.610 回答