迭代器的一个简单用法是这样的:
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;
取消引用,我们是否可以认为它们也是指针?
谢谢
答案 0 :(得分:5)
- 每当我们看到像
醇>class-name::member-name
这样的声明时,它就是该类的静态成员。因此,由于迭代器被声明为container<type>::iterator
,我们可以认为它们是容器的静态成员吗?
没有!您提到的上下文提供了带类的内部类型声明。这与static
班级成员无关。
- 由于迭代器使用与
醇>cout << (*iter) << endl;
相同的sintax取消引用,我们是否可以认为它们也是指针?
没有。你不能认为iterator
是指针。这只是iterator traits指定的某些约束的可行实现的一种方式。
答案 1 :(得分:3)
来自C ++标准(9.2类成员)
1类定义中的成员规范声明全套 班级成员;其他任何成员都无法添加。的成员 一个类是数据成员,成员函数(9.3),嵌套类型, 和普查员。
在此声明中
vector<int>::iterator iter;
声明对象iter
的类型为vector<int>::iterator
,iterator
此类型中的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。