Использование std::set_intersection
— это своего рода хак:
map<int,vector<int>> id2courses;
map<int,vector <int>> i2allowed_courses;
set_intersection(id2courses.begin(), id2courses.end(),
i2allowed_courses.begin(), i2allowed_courses.end(),
null_output_iterator(),
compare_and_do_something_if_same_key);
null_output_iterator
взят из вопроса Отказ от вывода функции, которой требуется итератор вывода.
compare_and_do_something_if_same_key
будет передаваться pair<const int, vector<int>>
с каждой карты. Если ключи равны, вы можете выполнить обработку, которую хотите. Вам также необходимо вернуть логическое значение для представления порядка элементов:
bool compare_and_do_something_if_same_key(
pair<const int, vector<int>& a, pair<const int, vector<int>& b)
{
if(a.first == b.first) {
doProcessing(a, b);
}
return a.first < b.first;
}
Предостережение Emptor: в документации сказано, что функция сравнения не должна изменять сравниваемые объекты. Я понимаю, что это означает, что нельзя изменять таким образом, чтобы вызвать проблемы с заказом. Поскольку вы не упорядочиваете значение second
в pair
, я не думаю, что это имеет большое значение.
изменить для удобочитаемости:
Это можно было бы обернуть в именованную функцию:
template<typename Map, typename KeyValueProcessor>
void process_values_for_matching_keys(
Map& map1, Map& map2, KeyValueProcessor& keyValueProcessor);
И используется как:
process_pairs_for_matching_keys(id2courses, i2allowed_courses, doProcessing);
person
Peter Wood
schedule
14.02.2013
std::set_intersection
. - person Some programmer dude   schedule 14.02.2013