一、vector
vector(向量)是一种顺序容器,可以理解为变长数组,数组长度可以随着需要自动改变。
1.vector的定义
要使用vector的功能,首先需要添加头文件。
#include <vector>
using namespace std;
定义:
vector<typename> v;
typename为数组类型,可以为int、double、char、结构体或者其他STL标准容器等。下面这条代码定义了一个二维vector数组,每一维的数组长度都是可变的。
注意:v前面的两个>之间要加空格,不然可能会被一些编译器视为移位操作。
vector<vector<int> > v;
二维vector数组还有一种定义方法如下,区别在于这样定义出来的二维数组其中一维长度是固定的。
vector<int> v[10];
2.vector元素访问方式
(1)使用下标访问
直接使用v[index]访问元素,index的取值为[0,v.size()-1]。size()函数可以得到vector中存在的元素个数。
for(int i=0;i<v.size();i++)
printf("%d ",v[i]);
(2)使用迭代器访问
迭代器(iterator)是一种对象,可以用来遍历标准模板库容器中的元素,每个迭代器对象代表容器中的确定的地址,可以类似于指针去理解。
定义一个vector迭代器对象:
vector<int>::iterator it;
得到了一个it迭代器对象后,可以使用it.begin()获取
vector的首元素地址,it.end()获取尾元素地址的下一个地址,*it访问元素。
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
printf("%d ",*it);
注意:vector的迭代器不支持it<v.end()这种写法,循环条件中只能写为it!=v.end()。
还有一种写法:
vector<int>::iterator it=v.begin();
for(int i=0;i<v.size();i++)
printf("%d ",*(it+i));
3.几个常用的函数
(1)push_back()
v.push_back(x)表示在v的尾部添加元素x
vector<int> v;
for(int i=1;i<=3;i++)
v.push_back(i);
(2)pop_back()
删除最后一个元素
(3)size()
获得元素个数
(4)clear()
清空所有元素
(5)insert()
v.insert(it,x)表示向迭代器it处插入元素x,原先it处的元素及其后面元素自动后移。
vector<int> v;
for(int i=1;i<=5;i++)
v.push_back(i); //1 2 3 4 5
vector<int>::iterator it=v.begin();
v.insert(it+3,6); //1 2 3 6 4 5
(6)erase
删除单个元素:v.erase(it),表示删除迭代器it处的元素
删除一个区间内的所有元素:v.erase(begin,end),左闭右开。
vector<int> v;
for(int i=1;i<=5;i++)
v.push_back(i); //1 2 3 4 5
vector<int>::iterator it=v.begin();
v.erase(it+3); //1 2 3 5
v.erase(it,it+2); //3 5
需要注意的是,常用的STL容器中,只有vector和string中才可以使用v.begin()+i、*(it+i)这种迭代器加上整数的写法。
判断两个vector是否相等可以直接用==判断。
二、set
set(集合),集合中的元素都是唯一且有序的。
1.set的定义
同样要使用set,需要添加头文件。
#include <set>
using namespace std;
定义:
set<typename> s;
set<typename> s[arraySize]; //定义一个set数组
typename可以是int、double、char、结构体、STL标准容器等。
2.set元素访问
不同于vector,set容器只能通过迭代器访问元素。
set<int> s;
for(set<int>::iterator it=s.begin();s!=s.end();it++)
printf("%d ",*it);
3.几个常用的函数
(1)insert()
s.insert(x)可以将元素x插入集合s,并且自动排序去重。
#include <stdio.h>
#include <set>
using namespace std;
int main(){
set<int> s;
s.insert(3);
s.insert(1);
s.insert(2);
s.insert(1);
for(set<int>::iterator it=s.begin();it!=s.end();it++)
printf("%d ",*it);
}
运行结果如下:
1 2 3
(2)find()
s.find(value)返回集合s中对应值为value的迭代器,如果集合中不存在value的值,则返回s.end()。
set<int> s;
for(int i=1;i<=5;i++)
s.insert(i); //1 2 3 4 5
printf("%d\n",*s.find(2)); //输出结果为:2
(3)erase()
删除单个元素:s.erase(it)表示删除it迭代器所处的元素;s.erase(value)表示删除值为value的元素。
set<int> s;
for(int i=1;i<=3;i++)
s.insert(i); //1 2 3
set<int>::iterator it=s.find(2);
s.erase(it); //靠迭代器删除元素2
s.erase(1); //靠元素值删除元素1
for(it=s.begin();it!=s.end();it++)
printf("%d ",*it); //输出结果为:3
删除一个区间内的所有元素:s.erase(begin,end),左闭右开。
set<int> s;
for(int i=1;i<=5;i++)
s.insert(i); //1 2 3 4 5
set<int>::iterator it=s.find(3);
s.erase(it,s.end()); //删除元素3到末尾之间的元素
for(it=s.begin();it!=s.end();it++)
printf("%d ",*it); //输出结果为:1 2
(4)size()
获得元素个数
(5)clear()
清空所有元素