为什么迭代器被定义为结构体而不是类?

3

我有一些关于STL迭代器实现的小问题。

  • 为什么迭代器被定义为结构体而不是类?
  • 主要原因是什么?
4个回答

5

这是一种实现选择。 C++中,classstruct几乎相同,区别在于默认的访问权限和继承方式,class为private, struct为public。因此,如果一个类型没有很多私有数据成员,则将其实现为结构体可能更合适。但是,你可以将完全相同的类型实现为以下两者之一:

struct Iterator : IteratorBase {
  SomeType x;
};

与...完全相同

class Iterator : public IteratorBase{
 public:
  SomeType x;
};

谢谢!我猜到了,但我还有一些疑问。 - ramb0tn1k

4
这是在标准中定义的,24.2 描述了 <iterator> header,它们是 struct。这个选择可能是因为迭代器提供对容器元素的访问,使它们成为 class 将是无用的,唯一的区别在于 class 默认具有 private 访问级别,而 struct 具有 public 访问级别。

所以如果将迭代器声明为 class 而不是 struct,就有两种选择:

  • 将所有成员设置为 public,这是无用的,因为可以通过直接设置为 struct 来获得相同的效果。
  • 使用 getter,这将提供不必要的开销和抽象。

+1 个标准参考。我错误地认为这是由实现决定的。 - juanchopanza
实际上,迭代器头文件描述了迭代器特性和迭代器结构,但具体的迭代器可能是类或结构体,在标准n3337的24.3-24.4中有详细说明。 - ForEveR

0
谁说迭代器是由结构体定义的?在标准中没有任何关于它的内容。结构体和类只有一个区别 - 对元素的访问权限。因此,在结构体中,默认情况下访问权限为公共,而在类中默认情况下访问权限为私有。

实际上是有的。请看我的回答。 - Luchian Grigore
这是在gcc 4.6(openSUSE 12.1)中迭代器的实现。 - ramb0tn1k

0

像最佳答案一样

类和结构体除了访问权限之外是相同的,因此使用结构体或类没有太大区别。

我们知道C++包含C

使用结构体似乎很简单,并区分结构体和类。

这是迭代器的定义

struct output_iterator_tag{}
struct input_iterator_tag{}
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag{}
struct random_accessl_iterator_tag : public bidirectional_iterator_tag{}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接