1

下面的代码是 Ubuntu 标准包中提供的类初始化器列表。在这个迭代器和 const_iterator 是相同类型的 typedef。我只是想知道为什么我们要为不同类型的 Iterator 使用相同的 typedef ?理想情况下,Iterator 应该有 typedef _E* 迭代器。

// In the class initializer list:
namespace std 
{ 
  /// initializer_list 
  template<class _E> 
    class initializer_list 
    { 
    public: 
      typedef _E                value_type; 
      typedef const _E&         reference; 
      typedef const _E&         const_reference; 
      typedef size_t            size_type; 
      typedef const _E*         iterator; 
      typedef const _E*         const_iterator;

PS:我想不出合适的标题,所以我给了这个标题

4

3 回答 3

5

为了满足Container的要求,这两种类型都必须iterator存在const_iterator。许多算法和大量代码依赖于具有这两种类型的容器。然而,没有理由该iterator类型必须是非const(可变)迭代器。在这种情况下,他们决定iteratorconst_iterator都是const(不可变的)迭代器。

他们拥有两个迭代器的原因const是因为他们显然不希望您能够更改initializer_list.

作为另一个例子,看看std::setwhoiteratorconst_iteratortypes 也是常量迭代器。由于std::sets 包含有序元素,如果您能够更改 s 的内容,则std::set该排序将无效。为了防止这种情况,两种迭代器类型都被设为不可变。

于 2013-02-13T17:43:09.787 回答
2

因为任何满足Container. 碰巧在 的情况下 std::initializer_list, theiterator和 theconst_iterator是相同的。

于 2013-02-13T17:41:54.713 回答
0

这可能是因为您不想更改存储在初始值设定项列表中的值。它们是要传递给构造函数的临时对象。

C++ 有一个(目前是非正式的)理想,称为适用于泛型类型的概念。Container 概念要求某些类型定义可用于您的对象。由于 std::initializer_list 是一个容器,它需要 ::iterator 和 ::const_iterator 类型定义。但是,与 std::set 一样,您不想让用户修改 initializer_list 中的元素,因此 ::iterator 与 ::const_iterator 相同:它们都是只读的。

于 2013-02-13T17:42:26.523 回答