C++ 9.1.2 容器内元素的类型约束-------非引用、非IO标准库类型

简介

容器内元素的约束:

  • 元素类型必须支持赋值运算;

  • 元素类型的对象必须可以复制。

  • 关联容器的键类型还需满足其他的约束(10章)

    • 除了引用类型外,所有内置或复合类型都可用作元素类型。引用不支持一般意义的赋值运算,引用必须初始化,初始化之后值不能再变了。因此没有元素是引用类型的容器。

    • IO库类型不支持复制和赋值,因此不能创建存放IO类型对象的容器,除输入输出(IO)标准库类型之外,所有其他标准库类型都是有效的容器元素类型。

    • 因为容器受容器元素类型的约束,所以可以定义元素是容器类型的容器。但是 > 符号直接要有空格,不然会被当做>>运算符的

===============================================================================================================

一、容器内元素的类型约束—-非引用、非IO标准库类型

C++语言中,大多数类型都可用作容器的元素类型。容器元素类型必须满足以下两个约束:

  • 元素类型必须支持赋值运算;

  • 元素类型的对象必须可以复制。

  • 关联容器的键类型还需满足其他的约束(10章)

    • 除了引用类型外,所有内置或复合类型都可用作元素类型。引用不支持一般意义的赋值运算,引用必须初始化,初始化之后值不能再变了。因此没有元素是引用类型的容器。

    • IO库类型不支持复制和赋值,因此不能创建存放IO类型对象的容器,除输入输出(IO)标准库类型之外,所有其他标准库类型都是有效的容器元素类型。

  • 容器本身也满足上述要求,因此可以定义元素本身就是容器类型的容器。

1、容器操作的特殊要求

  • 支持复制和赋值 功能是容器元素类型的最低要求,此外,一些容器操作对元素类型还有特殊要求。

  • 其中一些需外加类型要求的容器操作是指定容器大小并提供单个初始化式的构造函数。如果容器存储类类型的对象,那么只有当其元素类型提供默认构造函数时,容器才能使用这种构造函数。

不是很懂!!!

//假设Foo 没有默认构造函数,但提供了需要一个int型形参的构造函数
vector<Foo> empty;//没有需要为元素默认构造
vector<Foo> bad(10);//错误!!!Foo没有默认的构造函数
vector<Foo> ok(10,1);//可以,每个元素初始化为1

2、容器的容器

因为容器受容器元素类型的约束,所以可以定义元素是容器类型的容器。

vector< vector<string> > lines;//注意是这个,而不是“vector<vector<string>> lines;”这个
//必须用空格隔开两个相邻的>符号,以示这是两个分开的符号,否则,系统会认为>>是单个符号,为右移操作符,结果会导致编译错误。

你可能感兴趣的:(容器元素类型约束)