【发布时间】:2011-05-17 11:24:50
【问题描述】:
我有以下代码,它执行一些迭代算法:
template<class Iterator>
void Foo(Iterator first, Iterator last) {
typedef typename Iterator::value_type Value;
std::vector<Value> vec;
vec.resize(last - first);
// ...
}
(last - first) 表达式 (AFAIK) 仅适用于随机访问迭代器(例如来自 vector 和 deque 的迭代器)。如何检查传递的迭代器满足此要求的代码?
【问题讨论】:
-
您可以使用
distance(first, last)完全避免检查。 -
这可能适用于您的特定用例,但一般来说,您不能依赖“随机访问”标签来说明迭代器指向的内存是连续的。查看 Microsoft 的 concurrent_vector 类的文档。随机访问仅意味着您有一个迭代器可以理解的 [] 运算符。另外,如何处理随机访问的反向迭代器?我有一个类似的问题,我在这里寻找答案:Filtering Iterators
-
@KentKnox:谁说过内存是顺序的?
last-first适用于所有随机访问迭代器,包括std::deque::iterator,它肯定不指向顺序内存。