2012-05-12 51 views
3

我有兩個地圖,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 

我有cre ated一組包含的日期作爲字符串作爲

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應該包含o NLY

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

但顯然我沒有做正確。有人可以建議最好的方法來做到這一點。

回答

1

遍歷it1,檢查是否first每個元素是tk2使用find()方法,並將其插入到集合,如果它的存在。在你的例子中你正在做的是檢查dataset中的元素,其中包含tk1tk2中的密鑰。

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

您應按如下方式比較字符串:

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

爲什麼?它更詳細,比plain更不清晰,並且在這裏做同樣的事情。 –

0

遍歷tk1中的元素並查看是否存在tk2中的鍵。如果是,請插入。

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

你可能會考慮std::set_intersectionkey_iteratorprevious answer

+0

日期是'std :: map'的關鍵字,所以它們已經被排序。 –

+0

好點 - 我有點知道這一點,然後我的記憶停止工作,我編輯了「如果你可以依賴...」,儘管它沒有任何實際意義。感謝您提醒我現實! :-) –

相關問題