原创作品转载请注明出处http://blog.csdn.net/always2015/article/details/44976729
顺序容器概述
一个容器就是一些特定类型的集合。顺序容器为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖元素的值,而是与元素加入容器时的位置相对应。所有的顺序容器都提供了快速访问元素的能力。顺序容器类型有几种:vector、deque、list、forward_list、array、string。在C++vector容器应该是最常用的,使用vector是最好的选择,下面我们就来讲讲他的一些用法。
vector知识一览
简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。因为是动态数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。vector也是一个类模板(class template)。模板允许程序员编写单个类或函数定义,这个类和函数定义可用于不同的数据类型上。因此,我们可以定义保存string对象的vector,或保存int值的vector,又或是保存自定义的类类型对象(如Sales_item对象)的vector。首先要使用vector,我们必须知道他是在哪里声明的,以及他在什么域里面。
一、初步引入:
1、包含相应头文件
#include<vector>
2、vector属于std命名域,使用全局命名域方式
using namespace std;
或者使用 using std::vector;
vector容器提供了很多接口,在下面的表中列出vector容器操作。
二、容器操作
1、创建vector对象,必须说明vector保存何种对象的类型,通过将类型放在类模板名称后面的尖括号中来指定类型,类型可以是用户自己定义的类型,也可以是常见类型,例如:
vector<int> vec;
上面相当于创建了一个整形数组vec[],这是一个动态的数组。没有指明数组大小。注意vector不是一种数据类型,而只是一个类模板。
2、对象的初始化,例如:
vector<int> vec;//默认构造函数vec为空
vector<int> vec1(vec);//vec1是vec的一个副本
vector<int> vec2(10,1);//10个int型元素,每个都初始化为1
vector<string> vec3(10);//10个string型元素,每个都是空string
3、几个重要操作,首先先建立一个vector对象
vector<int> vec;
添加元素
vec.push_back(a) //在数组的最后添加一个数据a
vec.insert(pos,elem) //在pos位置插入一个elem拷贝,传回新数据位置
vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
删除元素
vec.pop_back() //删除数组的最后一个数据
vec.erase(pos) //删除pos位置的数据,传回下一个数据的位置
vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
vec.clear() //删除vec中所有元素,返回void
vec向量的大小
vec.size() //返回容器中实际数据的个数。
vec.empty() //判断vector是否为空,里面有数据返回false,否则返回true
获取迭代器
vec.begin() //返回vec的首元素
vec.end() //返回尾元素之后元素的位置,即最后一个单元+1的指针
vec.rbegin() //将vector反转后的开始指针返回(其实就是原来的end()-1)
vec.rend() //将vector反转构的结束指针返回(其实就是原来的begin-1)
访问vector中的数据
第一种方式 vec.at(index) //函数和[]函数使用可以说是一模一样. 都是为了访问对应index中存储的数据, 如果index大于vector的size. 两者都是抛出out_of_range的exception.
第二种方式 vector::operator[]
operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作,由于operator[]容易造成一些错误,所有我们很少用它
vector其他成员函数
vec.assign(beg,end) //将[beg; end)区间中的数据赋值给c。
vec.assign(n,elem) //将n个elem的拷贝赋值给c。
vec.back() //传回最后一个数据,不检查这个数据是否存在。
vec.front() //传回地一个数据。
vec.swap(b) //交换vec和b中元素
- swap(a,b) //和vec.swap(b)一样
联系拓展
平时用到vector时候,很多情况下会涉及到排序的问题。对于C++的排序,c++标准库里有排序函数。排序函数sort()就是最常用的。其在头文件为:
#include<algorithm>
sort()函数有3个参数:
第一个是要排序的数组的起始地址
第二个是结束的地址(最后一位要排序的地址)
第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序
sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大)。
如果我们想按照自己方法排序,那么我们可以通过重写排序比较函数按照降序比较,例如按照降序排序,如下:
定义排序比较函数:
bool Compare(const int &a,const int &b)
{
return a>b;
}
调用时:sort(vec.begin(),vec.end(),Compare),这样就降序排序。