指针或类作为迭代器?

时间:2011-06-18 14:19:53

标签: c++ containers

我正在用C ++编写随机访问容器。在我的代码中我使用它(好吧,在我的实际代码中我使用各种Allocator typedef,这更容易理解):

template<typename T, typename Allocator = std::allocator<T> >
class Carray {
public:
    // ...
    typedef T* iterator;
    typedef const T* const_iterator;
    // ...
};

但我也可以创建一个派生自std::iterator的不同迭代器类。这将添加对typedef(it::iterator_categoryit::difference_type等)的支持。

现在我的问题是,使用迭代器类而不是原始指针会产生开销吗?如果是,那么这个开销有多大,并且它是否严重到不使用迭代器类?

2 个答案:

答案 0 :(得分:2)

即使您有原始指针,也可以使用迭代器类别,差异类型等avalaibale。你知道,你应该使用这个iterator_traits<>模板。它已经专门用于指针。

iterator_traits<int*>::value_type // ... etc. 
//or
iterator traits<my_custom_iterator>::value_type

答案 1 :(得分:2)

如果你的迭代器类只是包装指针,几乎肯定没有开销。

完全符合标准 - 使用原始指针作为迭代器。但是,一些编写错误的代码(包括,如您所建议的那样,尝试直接使用嵌套typedef而不是iterator_traits的代码)可能无法编译。一些早期的标准库以向量迭代器的指针开始并进行了更改,纯粹是为了防止这些糟糕的代码工作。这真的是我想到打扰的唯一原因。

BTW - 如果可能的话,我会使用Boost迭代器支持,而不是直接从std :: iterator派生;很多细微的要求都会以这种方式照顾你。