迭代器是静态指针吗?

时间:2016-11-20 19:55:12

标签: c++ iterator

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

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<type>::iterator,我们可以认为它们是容器的静态成员吗​​?

2)由于迭代器使用相同的指针cout << (*iter) << endl;取消引用,我们是否可以认为它们也是指针?

谢谢

3 个答案:

答案 0 :(得分:5)

  
      
  1. 每当我们看到像class-name::member-name这样的声明时,它就是该类的静态成员。因此,由于迭代器被声明为container<type>::iterator,我们可以认为它们是容器的静态成员吗​​?
  2.   

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

  
      
  1. 由于迭代器使用与cout << (*iter) << endl;相同的sintax取消引用,我们是否可以认为它们也是指针?
  2.   

没有。你不能认为iterator是指针。这只是iterator traits指定的某些约束的可行实现的一种方式。

答案 1 :(得分:3)

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

  

1类定义中的成员规范声明全套   班级成员;其他任何成员都无法添加。的成员   一个类是数据成员,成员函数(9.3),嵌套类型,   和普查员。

在此声明中

vector<int>::iterator iter;

声明对象iter的类型为vector<int>::iteratoriterator此类型中的vector<int>是类datamash嵌套类型 < / p>

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

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

答案 2 :(得分:2)

  

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;
}

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

  

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

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