是否有一种优雅的方式来遍历2个地图并比较值(地图具有相同的类型)

时间:2013-02-14 09:10:56

标签: c++ stl stdmap

假设我有2张地图:

map<int,vector<int>> id2courses;
map<int,vector <int>> id2allowed_courses;

我想为每个键(id)查看课程列表是否仅包含那个id允许的课程。它可以很容易地用for循环完成,但我想利用std :: map是有序的事实,也就是我想在两个映射中前进(用较小的键递增迭代器)并且当我按下相等的键时我想做比较。 我知道我可以用非常重要的while循环来实现它,但我想知道是否有内置的STL方法来实现它

2 个答案:

答案 0 :(得分:2)

使用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来自问题Discarding the output of a function that needs an 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;
}

Caveat 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);

答案 1 :(得分:1)

您可以使用set_intersection(),但这种实现虽然更易于阅读但效果也不尽相同。我将使用一个循环并在两个映射上增加两个迭代器。我认为没有更快的解决方案。即使有内置的东西,它也会在这个天真的解决方案中表现得最好。