Jer*_*fin 16 c++ generics c++11
给定迭代器,是否可以为此迭代器引用的集合检索/使用正确的比较函数?
例如,假设我正在编写一个通用算法:
template <class InIt, class T>
void do_something(InIt b, InIt e, T v) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在,让我们说我想要做简单的东西,比如查找v在[b..e).如果是b和a e的迭代器std::vector,我可以简单地使用if (*b == v) ....但是,让我们假设它是b并且e是a的迭代器std::map.在这种情况下,我应该只比较键,而不是地图中包含的值的整个值类型.
所以问题是,如果这些迭代器进入地图,我该如何检索只比较键的地图的比较函数?与此同时,我不想盲目地假设我正在使用其中map任何一个.例如,如果迭代器指向a set,我想使用为其定义的比较函数set.如果他们指向vector或者deque,我可能不得不使用==,因为这些容器不会定义比较函数.
哦,差点忘了:我意识到在很多情况下,一个容器只有一个容器operator<而不是operator==它所包含的元素 - 我完全可以使用它.
Pet*_*ker 11
迭代器不必连接到容器,因此它们不会向您提供有关它们未必连接的容器的任何详细信息.这是基本的迭代器抽象:迭代器分隔序列,而不考虑序列的来源.如果您需要了解容器,则必须编写采用容器的算法.
没有标准的方法从迭代器映射到底层容器类型(如果有这样的容器).您可能可以使用一些启发式方法来尝试确定哪个容器,尽管这不会很简单,也可能无法保证.
例如,你可以使用一个元函数来确定*VALUE_TYPE*是std::pair<const K, T>,这是一个暗示,这可能是一个std::map和提取类型后K,并T尝试使用元函数,以确定是否迭代器的类型和种类std::map<K,T,X,Y>::iterator或std::map<K,T,X,Y>::const_iterator匹配特定组合X,Y.
如果地图可能足以确定(即猜测成功率很高)迭代器引用a std::map,但你应该注意,即使你可以使用它,甚至提取X比较器的类型,在一般情况下,不足以复制比较器.虽然不常见(并且不推荐)比较器可以具有状态,但如果没有直接访问容器,您将不知道比较器的特定状态.还要注意,在某种情况下,这种类型的启发式方法甚至无法提供帮助,在std::vector<>迭代器类型的某些实现中直接指向一个指针,在这种情况下,您无法将"迭代器"区分为数组而将迭代器区分为std::vector<> 相同的基础类型.