某同学:“你直接用STL不就好了!!!搞这么麻烦干嘛!”
我:“我tm就是不用你想怎么滴!!!我就是*外面,从这里*下去,也不会*STL一下!”
我现在有种不祥的预感。。。怎么某定理又要应验了QAQ。
一.vercot
我在蓝书(注:《算法进阶指南》)上看到过vector描述,但是那时候觉得这是个什么玩意儿?有什么鸟用吗?现在才发现它原来也有些用处。
1.介绍:
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。--by 百度百科。
2.函数及其用法:
先看看vector的函数列表:
constructors 构造函数
operators 对vector进行赋值或比较
assign() 对vector中的元素赋值
at() 返回指定位置的元素
back() 返回最末一个元素
begin() 返回第一个元素的迭代器
capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
clear() 清空所有元素
empty() 判断vector是否为空(返回true时为空)
end() 返回最末元素的迭代器(实际上指向最末元素的下一个位置)
erase() 删除指定元素
front() 返回第一个元素
get_allocator() 返回vector的内存分配器
insert() 插入元素到vector中
max_size() 返回vector所能容纳元素的最大数量(上限)
pop_back() 移除最后一个元素
push_back() 在vector最后添加一个元素
rbegin() 返回vector尾部的逆迭代器
rend() 返回vector起始的逆迭代器
reserve() 设置vector最小的元素容纳数量
resize() 改变vector元素数量的大小
size() 返回vector元素数量的大小
swap() 交换两个vector
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在我们讲讲函数的具体用法。
这么多的函数,并不是全部都十分有用,这里我们只讨论一些比较常见的。
首先,vector支持基础的运算符操作(==,!=,>=,<=,>,<),但是这个比较的标准是什么呢?标准是两个vector内有相同的容量,所有相等位置的元素相同。访问位置与数组相同
at()函数使用方法:
因为vector支持随机访问,因此少不了RE的可能性。。。at函数虽然效果和[]类似,但是它相对于[]显得更加的安全,因为它并不会出现越界访问这种东西。类数组访问:v[x],at函数访问方法v.at(x);
front()&back()函数:
这两个函数第一个返回第一个元素,另一个返回最末元素。用法:v.front(),v.back()。
begin()&end()函数:
这又是一对函数,其中前者返回当前vector起始元素的迭代器,后者则返回的是vector末尾元素的迭代器,利用这两个函数我们可以很好地遍历vector数组。用法:v.begin(),v.end()。
注:上文提到的遍历方法的代码:
for(it=v.begin();it!=v.end();it++)
cout<<*it;
clear()函数:
用来清空一个vector,用法:v.clear();
empty()函数:
用来判断vector是否为空,用法:v.empty(),如果为空则为真,反之为假。
erase()函数:
该函数用来删除vector里的元素,既可以删除一个位置的也可以删除一个区间的(注:左闭右开)。
用法:v.erase(iterator x)(删除一个位置),v.erase(iterator x,iterator y)(删除[x,y))区间。
insert()函数:
该函数用来插入元素,常用操作是在一个元素前面插入另一个元素,用法:v.insert(iterator x,y)即在x这个位置前插入一个y。
pop_back()&push_back()函数:
前者删除末尾元素,后者在末尾添加元素,用法:v.pop_back(),v.push_back()。
size()函数:
返回当前vector中所含元素个数,用法:v.size()。
3.相关例题及其分析:
知道这么多是不是很想去尝试一下呢?
此处先空,有空整理。
二.set
1.介绍:
set是个什么鬼玩意儿?我也不知道,查查百度百科先,巧了,没有!(反正我没查到)那看看别人的介绍吧。
关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。(红黑树是啥?这边)
2.函数及其用法:
看看set的函数列表。
begin():返回指向第一个元素的迭代器
clear():清除所有元素
count():返回某个值元素的个数
empty():如果集合为空,返回true
end():返回指向最后一个元素的迭代器
equal_range():返回集合中与给定值相等的上下限的两个迭代器
erase():删除集合中的元素
find():返回一个指向被查找到元素的迭代器
get_allocator():返回集合的分配器
insert():在集合中插入元素
lower_bound():返回指向大于(或等于)某值的第一个元素的迭代器
key_comp():返回一个用于元素间值比较的函数
max_size():返回集合能容纳的元素的最大限值
rbegin():返回指向集合中最后一个元素的反向迭代器
rend():返回指向集合中第一个元素的反向迭代器
size():集合中元素的数目
swap():交换两个集合变量
upper_bound():返回大于某个值元素的迭代器
value_comp():返回一个用于比较元素间的值的函数
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接着讲讲用法。
其实常用的函数也不多。
begin()&end()函数:
其中前者返回set起始元素的迭代器,后者则返回的是set末尾元素的迭代器,用法:set.begin(),set.end()。注意:同其它许多STL一样,set.end()返回的是最后元素迭代器的后一个元素!!!
clear()函数:
用来清空set,用法:set.clear();
empty()函数:
用来判断set是否为空,是为真,否则为假。用法:set.empty();
count()函数:
用来返回set中某个元素的个数,用法:set.count();
erase()函数:
删除set中的一个元素,并返回下个元素的迭代器。
find()函数:
寻找set中某个元素,并返回该元素的迭代器,若不存在返回set.end(),用法:set.find();
lower_bound()&upper_bound()函数:
lower_bound()函数返回set中大于等于一个元素的元素的迭代器。
upper_bound()函数返回set中大于一个元素的元素的迭代器。
若没有两者都会返回set.end(),用法:set.lower_bound(x),set.upper_bound(),其中x为要查找的元素。
insert()函数:
在set中插入一个元素,但是由于set中不存在相同元素,所以当元素已存在时会插入失败。所以在使用完此函数之后会返回插入位置的迭代器和是否插入成功的bool合并而成的pair。
size()函数:
返回set中的元素个数。
3.相关例题及其分析:
Oh,shift,我现在又多了一个坑代填。。。
不过可以给道题。