9.1.2 容器内元素的类型约束
容器元素类型必须满足以下两个约束:
- 元素类型必须支持赋值运算。
- 元素类型的对象必须可以复制。
除输入输出(IO)标准库类型之外,所有其他标准库类型都是有效的容器元素类型。特别地,容器本身也满足上述要求。因此可以定义元素本身就是容器类型的容器。
IO库类型不支持复制或赋值。因此,不能创建存放IO类型对象的容器。
1. 容器操作的特殊要求
vector<MyClass> m(10, 10);
for(vector<MyClass>::iterator i = m.begin();i!=m.end();++i)
{
cout << (*i).Method() << endl;
}
class MyClass
{
public:
MyClass()
{
this -> i =0;
}
MyClass(int i)
{
this -> i =i;
}
int Method()
{
return this -> i;
}
private:
int i;
};
其中一种需要外加类型要求的容器操作是指定容器大小并提供单个初始化式的构造函数。如果容器存储类类型的对象,那么只有当其元素类型提供默认构造函数时,容器才能使用这种构造函数。尽管有一些类没有提供默认构造函数,但大多数类类型都会有。
2. 容器的容器
因为容器受容器元素类型的约束,所有可定义元素是容器类型的容器。
必须使用空格隔开两个相邻的>符号,以示这是两个分开的符号,否则,系统会以为>>是单个符号,为右移操作符,并结果导致编译时错误。
vector<vector<MyClass> > m;