假设我有两张 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/