c++顺序容器vector用法

来源:互联网 发布:永恒之塔数据库 编辑:程序博客网 时间:2024/06/05 06:17

原创作品转载请注明出处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型元素,每个都初始化为1vector<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),这样就降序排序。

0 0
原创粉丝点击