C++primer笔记-第3章 字符串、变量和数组(标准库类型vector)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liaoyanyunde/article/details/83722286

 标准库string、vector都是对内置数组类型的抽象,string支持变长的字符串,vector表示可变长的集合。迭代器是string和vector的配套类型,常用于访问string或者vector中的元素。
vector作为标准库的一部分,定义在命名空间std中。

#include <vector>
using namespace std::vector;

 vector 容器 表示对象的集合,其中所有对象的类型均相同。
 vector本身是一个类模板,所以定义vector对象时一定要指定类型。相当于有两次实例化,第一次是类模板实例化,实例化成类;第二次是类实例化,实例化成类对象。
 要注意的是,引用不是对象,不能用来初始化vector类模板。
 此外,定义vector类型的vector,在c++11以前是需要在尖括号之前加个空格的:

//c++11以前,需要加空格
vector<vector<int> > vec;
//c++11以后,不需要加空格
vector<vector<int>> vec;

1、定义和初始化vector对象

vector<T> v1; //v1是一个空vector,它潜在的元素是T类型,执行的默认初始化
vector<T> v2(1); //v2中包含有v1中的所有元素副本,v1 v2的类型必须相同
vector<T> v2=v1;//等价于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……}

 如果使用了花括号,但是提供的值不能用于初始化元素,编译器会尝试用默认值初始化vector对象。

vector<string> v6{"hi"}; //列表初始化,v6有一个元素
vector<string> v7("hi");  //错误,不能使用字符串字面值 构建vector对象
vector<string> v8{10}; //v7有十个默认初始化的元素
vector<string> v9{10,"hi"};//v9有十个值为“hi”的元素

2、vector操作

2.1 添加元素

 只能用push_back添加元素,下标(实际上也是引用)只能用于访问和修改元素。

vector<int> v;
for(int i=0;i<100;i++){
	v.push_back(i);
}

 vector中提供了高效增长的机制,先定义空vector再添加元素是最高效的。先设定大小,性能反而会更差。

在使用范围for循环的时候,不能改变其大小。
范围循环示例:

vector<int> vect={1,2,3,4,5};
for(int elem:vect){
	cout<<elem<<endl;
}

2.2 其他操作
vector的操作与string类似。
v.empty() 判断是否为空,空则返回true
v.size() 返回v中元素个数,类型是size_type
v.push_back(t) 向v的尾端添加一个值为它的元素
v[n] 返回v中第n个元素的引用
v1= v2 用v2的元素拷贝替换v1中的元素
v1={a,b,c……} 用列表中的元素拷贝替换v1中的元素
v1==v2 当且仅当v1 v2元素数量和对于位置元素类型和值都相同的时候才相等
v1!=v2
<,<=,>,>= 以字典顺序进行比较,如果相同位置上的值相同,则数量少的小,如果相同位置上的值不同,则由第一对异值的大小关系决定。

vector一定要搭配具体的类型才能使用。

修改vector里面的值一定要使用引用或者迭代。

vector<int> vect = {1,2,3,4,5,6};
for(int &elem:vect){
	elem*=elem;//求元素的平方
}
vector<int> vect = {1,2,3,4,5,6};
auto begin = vect.begin();
while(begin!=vect.end()){
	(*begin)*=(*begin);
	begin++;
}

 使用下标访问元素,一定要注意不能越界访问,用下标去访问一个不存在的元素,编译器不会报错,但运行的时候会出现不可预知的错误。

猜你喜欢

转载自blog.csdn.net/liaoyanyunde/article/details/83722286