【问题标题】:C++ when and how are std::iterator value_type, reference, pointer used?C++ 何时以及如何使用 std::iterator value_type、引用、指针?
【发布时间】:2025-12-25 12:30:11
【问题描述】:

我正在为不支持 STL 和 Boost 的环境编写容器和迭代器的集合。在处理迭代器及其返回类型时——例如,通过 GetValue 函数,我在处理可以包含值类型和指针类型的容器(例如 Vector)方面有些挣扎。由于想要支持 const 迭代器,情况变得更加复杂。我看过here关于一系列traits的定义:value_type、reference、pointer。我的问题是如何在创建迭代器的上下文中使用它们?本质上,考虑到我想要

Object & Vector<Object>::Iterator::GetValue()
Object * Vector<Object*>::Iterator::GetValue() 
const Object & Vector<Object>::ConstIterator::GetValue()
const Object * Vector<Object*>::ConstIterator::GetValue()

value_type、reference、pointer 是如何影响这个的?

【问题讨论】:

  • 您是否尝试查看std::vector 的作用?提示:std::vector&lt;int *&gt;::pointerint **
  • @Potatoswatter 是的,很明显 std::vector::pointer 是**。我的问题与如何在为迭代器的返回类型创建正确签名的上下文中使用这些有关。

标签: c++ templates pointers reference iterator


【解决方案1】:

迭代器的成员类型用的不多。幸运的是,您无需费心定义它们。 std::iterator 基类为您完成。

template< typename value_type >
struct my_vector_iterator
    : std::iterator< std::random_access_iterator_tag, value_type >
    …

template< typename value_type >
struct my_vector_const_iterator
    : std::iterator< std::random_access_iterator_tag, value_type const >
    …

【讨论】:

  • 正如我所提到的,在这些情况下我无法使用 STL,但感谢您指出正在发生的事情。在这些情况下,'value_type' 只是 T 或 T*,如果容器包含指向类型 t 的指针?
  • @Steven 是的,就是这么简单。如果容器包含指针,它的实现将涉及指向指针的指针,但永远不会(永远)直接指向指向的类型。
  • 所以对于 std::vector 是迭代器 Object * & 或 Object * 上 * 运算符的返回类型?