3

假设我有 2 张地图:

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

我想为每个 key(id) 查看课程列表是否仅包含该 id 允许的课程。它可以通过 for 循环轻松完成,但我想利用 std::map 是有序的这一事实,也就是我想在两个映射中前进(用较小的键递增迭代器),然后当我点击相等的键时我想做比较。我知道我可以用非平凡的 while 循环来做到这一点,但我想知道有没有内置的 STL 方法来做到这一点

4

2 回答 2

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 need a output iterator

compare_and_do_something_if_same_keypair<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);
于 2013-02-14T09:29:11.000 回答
1

您可以使用set_intersection(),但是这个实现虽然更容易阅读,但性能并不好。我会使用一个循环并在两个映射上增加两个迭代器。我认为没有更快的解决方案。即使有一些内置的东西,它的性能也会和这个幼稚的解决方案一样好。

于 2013-02-14T09:16:45.073 回答