读C++ Primer——vector标准库

vector类型

vector对象的定义和初始化

vector是一个类模板

vector<T> v1;//vector保存类型为T的对象。默认构造函数,v1为空
vector<T> v2(v1);//v2是v1的一个副本,确保两个对象类型相同
vector<T> v3(n,i);//v3是含n个值为i的元素
vector<T> v4(n);//v4含有初始化的元素的n个副本

值初始化

vector<int> v(10);//10个元素都被初始化为0
vector<string> v(10);//10个元素都被初始化为空串

如果元素类型是没有定义任何构造函数的类类型,这种情况下,标准库仍然产生一个带初始值的对象,这个对象的每个成员进行了值初始化

vector对象的操作

v.empty()//如果v为空,返回true
v.size()//返回v中元素的个数,返回值类型为size_type
v.push_back(t)//在v的末尾增加一个值为t的元素
v(n)//返回元素值
v1=v2//把v1的元素值全部替换为v2中元素的副本
!=,<,<=,>,>=//保持原有含义

注意:

  1. size()返回值类型为size_type
  2. 必须是已存在的元素才能下标操作进行索引,通过下标操作进行赋值时不会添加任何元素,添加元素要使用push_back()

迭代器的简介

每种容器都定义了自己的迭代器类型,迭代器是一种检查容器内元素并遍历元素的数据类型,因为迭代器对所有容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作(只有少部分有下标操作)来访问容器元素

容器的iterator类型

vector<int>::iterator it;//it的数据类型为vector<int>定义的iterator类型

begin和end操作

每种容器都定义了一对命名为begin和end的函数,用于返回迭代器,如果容器内有元素,begin操作返回的迭代器指向容器内的第一个元素,end操作返回的是迭代器指向vector的“末端元素元素的下一个”,通常称为超出末端迭代器,它指向一个不存在的元素,若vector为空,begin和end操作返回的迭代器相同。

vector迭代器的自增和解引用运算

  1. *it来访问迭代器所指向的元素
  2. ++it来实现迭代器的移动,使其指向容器内的下一个元素

迭代器的其他操作

用==和!=操作符来比较两个迭代器,如果两个迭代器指向同一个元素,则他们相等,否则就不相等。

const_iterator类型

该类型的迭代器只能读取容器元素而不能改变元素的值

for(vector<int>::const_iterator it=v.begin();it!=v.end();++it) {
cout<<*it<<end;//ok
*it=0//error
}

不要把const_iterator对象与const的iterator搞混,声明一个const类型的迭代器时必须初始化,且初始化后不能改变其值(迭代器不能再移动)

vector<int> v(10,0);
for(const vector<int>::iterator it=v.begin();it!=v.end();it++) {
*it=1;//ok
++it;//error
}
const vector<int> v(10,0);
const vector<int>::iterator it=v.begin();//error
vector<int>::const_iterator it=v.begin()//ok
*it=10;//error
++it//ok

迭代器的算术操作

vector<int> v(10,0);
vector<int>::iterator it1;
vector<int>::iterator it2;
it1+n;//产生一个新的迭代器,其位置在it所指元素加n个位置(n为size_type或difference_type类型)
it1-n;
it1-it2;//计算两个迭代器对象之间的距离,两迭代器必须指向同一个vector容器(距离类型为difference_type)
vector::iterator mid=v.begin()+v.size()/2;//mid直接指向靠近容器中心的元素

注意:任何改变容器长度的操作都会使当前迭代器失效,例如调用push_back()添加元素后,就不能再信赖当前迭代器的值了。

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/106177958