3

私は2つのマップを持って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 に入力したいので、 と の両方にある日付のみが含まれます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;
}

しかし、明らかに私はそれを正しく行っていません。誰かがこれを行うための最良の方法を提案できますか?

4

4 に答える 4

3

前の回答からstd::set_intersectionと考えるかもしれません。key_iterator

于 2012-05-12T17:14:42.647 に答える
1

を反復し、各要素がメソッドを使用しているit1かどうかを確認し、存在する場合はセットに挿入します。この例で行っているのは、 ORにあるキーを含む の要素をチェックすることです。firsttk2find()datasettk1tk2

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 に答える