“vector <x> :: iterator”是否意味着存在“vector <x>”命名空间?</x> </x>

时间:2011-09-25 04:40:11

标签: c++ stl

我见过代码

vector<char> v(10);
vector<char>::iterator p;

这里需要vector<char>::。这是否意味着迭代器是向量命名空间中的一个类?

5 个答案:

答案 0 :(得分:4)

  

是否意味着迭代器是向量命名空间内的一个类?

不完全是vector 模板中的类型。迭代器不仅取决于容器的类型(这里是vector),还取决于迭代的元素类型(这里是char)。

答案 1 :(得分:2)

可能最简单的方法是理解::是范围运算符,而不仅仅是命名空间。

std::vector<char>是一个类,因此它有自己的类范围(C ++ 03中为3.3.6,C ++ 11中为3.3.7)。 std::vector<char>::iterator是该范围内的完全限定名称。在iterator的情况下,它命名一个类型 - 不一定是类,即使它本身也不一定在std::vector<char>中定义,因为iterator可能是一个typedef

碰巧,类范围不是C ++称之为“命名空间”的东西之一。在日常[*]英语中,您可以将其描述为一种命名空间,它只不是C ++中的正确​​术语。

但是,无论如何,请注意它是vector<char>哪个是类,并且其范围包含iterator,而不是vectorstd::vector确保任何vector<T>都具有iterator类型,但对于其他模板,并不一定每个特化都具有相同的成员和嵌套类型。所以没有vector范围。

[*]“每天”,如果您的日子是那些谈论名称空间的人的日子。

答案 2 :(得分:1)

是的,它确实意味着那个。 Iterator在类vector的范围内定义,并且对于每个不同的类型创建vector,迭代器也有不同的实现。

答案 3 :(得分:1)

这也意味着迭代器在vector<char>而不是vector<int>上运行。

答案 4 :(得分:0)

命名空间无法进行模板化,因此向量不能是命名空间。 实际上,vector是一个模板类(而vector是一个实例化),迭代器是一个嵌套类型。

但问题有一点:A :: B语法通常无法区分。在名称解析方面,如果是事实,两个类的名称空间都是......名称的容器。

类不仅仅是名称容器:它们代表具有实例和相关功能的数据。 命名空间只是名称的容器