C++标准模板库(STL):vector和set

一、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()
清空所有元素

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值