2012-05-12 2 views
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 

У меня есть cre мировали набор, содержащий даты в виде строк, как в

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 должен содержать o олько

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, которые содержат ключи, которые находятся в tk1 ИЛИ tk2.

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

Почему? Это более подробный, менее ясный, чем простой ==, и делает то же самое здесь. –

0

перебирать элементы в tk1 и посмотреть, если ключи существуют в tk2. Если да, тогда вставьте.

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

Вы могли бы рассмотреть std::set_intersection с key_iterator из previous answer.

+0

Даты являются ключами 'std :: map', поэтому они уже отсортированы. –

+0

Хорошая мысль. Я знал, что тогда моя память перестала работать, и я редактировал «Если вы можете зависеть ...» в ней, хотя это и не имело никакого реального смысла. Спасибо, что напомнили мне о реальности! :-) –

Смежные вопросы