给定迭代器,检索容器的比较函数

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

迭代器不必连接到容器,因此它们不会向您提供有关它们未必连接的容器的任何详细信息.这是基本的迭代器抽象:迭代器分隔序列,而不考虑序列的来源.如果您需要了解容器,则必须编写采用容器的算法.

  • 示例:一些`string`和`vector`将迭代器实现为裸指针(利用顺序和连续的底层缓冲区). (2认同)

Dav*_*eas 6

没有标准的方法从迭代器映射到底层容器类型(如果有这样的容器).您可能可以使用一些启发式方法来尝试确定哪个容器,尽管这不会很简单,也可能无法保证.

例如,你可以使用一个元函数来确定*VALUE_TYPE*是std::pair<const K, T>,这是一个暗示,这可能是一个std::map和提取类型后K,并T尝试使用元函数,以确定是否迭代器的类型和种类std::map<K,T,X,Y>::iteratorstd::map<K,T,X,Y>::const_iterator匹配特定组合X,Y.

如果地图可能足以确定(即猜测成功率很高)迭代器引用a std::map,但你应该注意,即使你可以使用它,甚至提取X比较器的类型,在一般情况下,不足以复制比较器.虽然不常见(并且不推荐)比较器可以具有状态,但如果没有直接访问容器,您将不知道比较器的特定状态.还要注意,在某种情况下,这种类型的启发式方法甚至无法提供帮助,在std::vector<>迭代器类型的某些实现中直接指向一个指针,在这种情况下,您无法将"迭代器"区分为数组而将迭代器区分为std::vector<> 相同的基础类型.