【问题标题】:are iterators static pointers?迭代器是静态指针吗?
【发布时间】:2017-04-04 04:05:57
【问题描述】:

迭代器的一个简单用法是这样的:

vector<int> v;
vector<int>::iterator iter;

v.push_back(1);
v.push_back(2);
v.push_back(3);

for (iter = v.begin(); iter != v.end(); iter++)
  cout << (*iter) << endl;

我有两个问题:

1) 每次我们看到像 class-name::member-name 这样的声明时,它都是该类的静态成员。
那么,既然迭代器被声明为container&lt;type&gt;::iterator,我们可以认为它们是容器的静态成员吗​​?

2) 既然迭代器是用相同的指针cout &lt;&lt; (*iter) &lt;&lt; endl; 的sintax 解引用的,我们可以认为它们也是指针吗?

谢谢

【问题讨论】:

  • v.std::vector&lt;int&gt;::push_back(1);、v.vector&lt;int&gt;::push_back(1); 或 v.vector::push_back(1); 有效也会反驳您的第一个断言。
  • “静态”对类型成员没有意义。
  • class-name::member-name 可以引用嵌套类型,这就是 vector&lt;int&gt;::iterator 的情况。如果vector&lt;int&gt;::iterator 是静态数据成员,vector&lt;int&gt;::iterator iter; 就没有任何意义。

标签: c++ iterator


【解决方案1】:
  1. 每次我们看到像class-name::member-name 这样的声明时,它都是该类的静态成员。那么,既然迭代器被声明为container&lt;type&gt;::iterator,我们可以认为它们是容器的静态成员吗​​?

不!您提到的上下文提供了一个带有类的内部类型声明。这与static 班级成员无关。

  1. 既然迭代器使用相同的指针cout &lt;&lt; (*iter) &lt;&lt; endl; 的sintax 解引用,我们可以认为它们也是指针吗?

没有。您不能将iterators 视为指针。对于iterator traits 指定的某些约束,这只是一种可行的实现方式。

【讨论】:

    【解决方案2】:

    来自 C++ 标准(9.2 类成员)

    1 类定义中的成员规范声明了完整的集合 班级成员;不能在其他地方添加任何成员。的成员 一个类是数据成员、成员函数 (9.3)、嵌套类型、 和枚举器。

    在此声明中

    vector<int>::iterator iter;
    

    声明对象iter 的类型为vector&lt;int&gt;::iterator,而iterator 在此类型说明符中是vector&lt;int&gt; 类的嵌套类型

    迭代器按其类别分类,随机访问迭代器的行为类似于指针,因为您可以对它们使用与指针相同的结构,例如,您可以使用运算符 [] 或者您可以减去两个迭代器或添加一个整数一个迭代器。

    但这并不意味着随机访问迭代器是指针,尽管它的行为类似于指针。指针本身可以被视为随机访问迭代器。

    【讨论】:

      【解决方案3】:

      1) 每次我们看到像 class-name::member-name 这样的声明时,它都是该类的静态成员。

      这个谓词不正确。您将范围解析运算符的使用限制为仅静态成员。虽然class-name:: 确实可以用来指代静态成员,但并非总是如此。有助于深入了解并了解其中的区别。

      例如,这里:

      class Employee{
      public:
         static int objCount; 
         //other members
      };
      int Employee::objCount = 0;
      

      范围解析运算符确实引用了静态成员。

      但是,这里:

      class outside
      {
      public:
            int x;
            class inside
            {
            public:
                  int x;
                  static int y; 
                  int foo();
      
            };
      };
      int outside::inside::y = 5; 
      
      int main(){
          outside A;
          outside::inside B;
      }
      

      相同的运算符用于在main() 中显式声明inside 类型的对象。 vector&lt;int&gt;::iterator 就是这种情况,其中iterator 对应于嵌套类inside。此外,在此语句中:int outside::inside::y = 5;,在两种上下文中都使用了相同的运算符。

      2) 既然迭代器是用相同的指针 cout

      有点。迭代器是常规 C++ 指针的远亲,因为它被设计为像指针一样工作(即,支持解引用,带有随机访问迭代器的指针算术),但不是 真正的 指针.这意味着指针始终指向内存中的特定对象,但迭代器不一定这样做。检查this SO post that discusses this topic。

      【讨论】:

        猜你喜欢
        • 2018-05-30
        • 2011-02-09
        • 2018-01-26
        • 2020-04-23
        • 2018-08-07
        • 1970-01-01
        • 2015-09-06
        • 2018-09-04
        相关资源
        最近更新 更多