c++ - 可能的 : Set Operations on Disparate Maps with Same Key Type?

标签 c++ stl dictionary set

假设我有两张 map :

typedef int Id;
std::map<Id, std::string> idToStringMap;
std::map<Id, double>      idToDoubleMap;

假设我想对两个 map 的键进行集合操作。 有没有比创建自定义“插入器”迭代器更简单的方法?这样我就可以做类似的事情:

std::set<Id> resultSet;
set_difference( idToStringMap.begin(), idToStringMap.end(), 
                idToDoubleMap.begin(), idToDoubleMap.end(), resultSet.begin() );

我的实验结果表明,有必要创建一个自定义插入器,也许还有一个自定义 key 比较器来执行此操作,但我想在这样做之前获得一些见解/捷径。

最佳答案

我认为仅使用 STL 而不使用自定义迭代器是不可能的。您应该创建一个通用的 select_1st_iterator。这会将任何迭代器包装成一对并在取消引用时返回 itr->first。

注意:STL 的一些扩展有一个 select1st 仿函数,它接受一对并返回第一个元素。但是我还没有看到迭代器版本。

如果您打算编写一个迭代器,我建议您使用 boost iterator library . select_1st_iterator 最有可能的候选对象是 transfor_iterator

假设 select_1st_iterator 是一个创建真正的 select_1st_iterator_t 类型的函数,它可能看起来像:

注意:如果您不使用 insert_iterator,您的代码将会崩溃对于 resultSet

template<class T>
select_1st_iterator_t<T> select_1st_iterator<T>(itr)
{
    return select_1st_iterator_t<T>(itr);
}

std::set<Id> resultSet;
set_difference(
    select_1st_iterator(idToStringMap.begin()), 
    select_1st_iterator(idToStringMap.end()),
    select_1st_iterator(idToDoubleMap.begin()),
    select_1st_iterator(idToDoubleMap.end()),
    std::inserter(resultSet, resultSet.begin()) );

关于c++ - 可能的 : Set Operations on Disparate Maps with Same Key Type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2504161/

相关文章:

c++ - 如何在 VS Code 中创建 C++ 项目并链接主函数、函数和 header ?

python - C++ (STL map) 等效于 Python 的 setdefault 的方法

c++ - 更改优先级队列元素是否会导致重新排序队列?

c++ - 关于使用用户定义方法扩展 C++ STL 容器的更好方法的建议

c++ - 如何从 NPObject 获取关联的 NPP 实例

c++ - sig_atomic_t 和 std::atomic<> 可以互换吗?

java - 按值对 Map<Key, Value> 进行排序

algorithm - 为什么我们说 map-reduce 比传统方法更好地解决了 "Paper reference"问题?

haskell - 具有无限域的映射(替换)

c++ - 使用指针和 rand() C++ 时遇到一个有趣的错误