C++ Primer笔记(3.3.1 )—— 定义和初始化vector对象
/********************************************************************/
/* 标准库类型vector表示对象的集合,其中所有对象的类型都相同。 */
/* 想要使用vector,必须包含适当的头文件。在后续的例子中,都将假定做 */
/* 了如下:using声明: */
/* #include<vector> */
/* using std::vector; */
/* */
/* vector是模板而非类型,由vector生成的类型必须包含vector中元素的类 */
/* 型,例如vector<int>。 */
/* */
/* vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象, */
/* 所以不存在包含引用的vector。 */
/********************************************************************/
#include<iostream>
#include<string>
#include<vector>
using std::string;
using std::vector;
/*************************************************************************************************/
/* 初始化vector对象的方法 */
/* */
/* vector<T> v1 ------ v1是一个空vector,潜在的元素是T类型,执行默认初始化 */
/* vector<T> v2(v1) ------ v2中包含有v1所有元素的副本 */
/* vector<T> v2 = v1 ------ 等价于v2(v1) */
/* vector<T> v3(n, val) ------ v3包含了n个重复的元素,每个元素的值都为val */
/* vector<T> v4(n) ------ v4包含了n个重复地执行了值初始化的对象 */
/* vector<T> v5{a, b, c...} ------ v5包含了初始值个数的元素,每个元素被赋予相应的初值 */
/* vector<T> v5 = {a, b, c...} ------ 等价于 v5{a, b, c...} */
/*************************************************************************************************/
int main()
{
/* ----- 例子 ----- */
vector<string> svec; //默认初始化,svec不含任何元素
//看起来空vector好像没什么用,但事实上,最常见的方式就是先定义一个空vector,然后当运行时获取
//到元素的值后再逐一添加
//当然也可以在定义vector对象时指定元素的初始值。例如,允许把一个vector对象的元素拷贝给另外一个vector
//对象。注意两个vector对象的类型必须相同
vector<int> ivec; //初始状态为空
//在此处给ivec添加一些值
vector<int> ivec2(ivec); //把ivec的元素拷贝给ivec2
vector<int> ivec3 = ivec; //把ivec的元素拷贝给ivec3
// vector<string> svec(ivec2); //错误:svec的元素是string对象,不是int
/* ---------------- */
/* ----- 列表初始化vector对象 ----- */
//C++11还提供了另外一种为vector对象的元素赋值的方法,即列表初始化
vector<string> articles = {"a", "an", "the"};
vector<string> v1{ "a", "an", "the" };
//vector<string> v2( "a", "an", "the" ); //错误,要用{}
/* -------------------------------- */
/* ----- 创建指定数量的元素 ----- */
//还可以用vector对象容纳的元素数量和所以元素的统一初始值来初始化vector
vector<int> ivec4(10, -1); //10个int类型的元素,每个都被初始化为-1
vector<string> svec(10, "hi"); //10个string类型的元素,每个都被初始化为“hi”
/* ------------------------------ */
/* ----- 值初始化 ----- */
//通常情况下,可以只提供vector对象容纳的元素数量而略去初始值。此时库会创建一个值初始化的元素初值,
//并把它赋给容器中的所有元素。这个初始值由vector对象中的元素类型决定。
vector<int> ivec5(10); //10个元素,每个都初始化为0
vector<string> svec2(10); //10个元素,每个都是空string对象
/* -------------------- */
/* ----- 列表初始值还是元素数量? ----- */
//在某些情况下,初始化的真实含义依赖于传递初始值时用的是花括号还是圆括号。
//例如,用一个整数来初始化vector<int>时,整数的含义可能是vector对象的容量也可能是元素的值。
vector<int> ve1(10); //ve1有10个元素,每个值为0
vector<int> ve2{ 10 }; //ve2有1个元素,值为10
vector<int> ve3(10, 1); //ve3有10个元素,每个的值都是1
vector<int> ve4{ 10, 1 }; //ve4有2个元素,值分别是10和1
//另一方面,如果初始化时使用了花括号的形式但是提供的值又不能用来列表初始化,
//就要考虑用这样的值来构造vector对象了。
vector<string> ve5{ "hi" }; //列表初始化:ve5有一个元素
// vector<string> ve6("hi"); //错误:不能使用字符串字面值构建vector
vector<string> ve7{ 10 }; //ve7有10个默认初始化的元素
vector<string> ve8{ 10, "hi" }; //ve8有10个值为“hi”的元素
/* ------------------------------------ */
return 0;
}