指针或类作为迭代器?

发布于 2024-11-15 20:11:55 字数 494 浏览 3 评论 0原文

我正在用 C++ 编写一个随机访问容器。在我的代码中,我使用这个(嗯,在我的实际代码中,我使用各种分配器类型定义,这更容易理解):

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 等)。

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

I'm writing a random access container in C++. In my code I use this (well, in my real code I use all kinds of Allocator typedefs, this is just easier to understand):

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

But I can also create a different iterator class derived from std::iterator. This would add support for typedefs (it::iterator_category, it::difference_type, etc).

Now my question, is there an overhead by using a iterator class instead of a raw pointer? If yes, how substantial is this overhead, and is it severe enough to not use a iterator class?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

痴情 2024-11-22 20:11:55

即使您有原始指针,您也可以使用迭代器类别、差异类型等。您会看到,您应该使用这个 iterator_traits 模板。它已经专门用于指针。

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

You have iterator category, difference type etc avalaibale for you even if you have a raw pointer. You see, there is this iterator_traits<> template which you should use. It is already specialized for pointers.

iterator_traits<int*>::value_type // ... etc. 
//or
iterator traits<my_custom_iterator>::value_type
春花秋月 2024-11-22 20:11:55

如果您的迭代器类只是包装指针,则几乎肯定不会有任何开销。

使用原始指针作为迭代器完全符合标准。但是,一些写得不好的代码(包括,正如您所建议的,尝试直接使用嵌套 typedef 而不是 iterator_traits 的代码)可能无法编译。一些早期的标准库从向量迭代器的指针开始并进行了更改,纯粹是为了让这些糟糕的代码正常工作。这确实是我认为打扰的唯一原因。

顺便说一句 - 如果可能的话,我会利用 Boost 迭代器支持,而不是直接从 std::iterator 派生;许多微妙的要求都会以这种方式得到满足。

If your iterator class simply wraps the pointer, there is almost certainly no overhead.

It's perfectly standard-conforming to use raw pointers as the iterators. However, some badly written code (including, as you suggest, code that tries to use nested typedefs directly instead of iterator_traits) may fail to compile. Some of the early standard libraries started with pointers for vector's iterators and changed, purely to keep such bad code working. That's really the only reason I'd think of for bothering.

BTW - if possible I'd make use of the Boost iterator support rather than deriving directly from std::iterator; a lot of subtle requirements are taken care of for you that way.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文