Standard Template Library

来源:互联网 发布:手机淘宝怎么贷款啊 编辑:程序博客网 时间:2024/06/05 07:54
STL(standard template library) 标准模板库
STL包括:
 容器,container
 迭代器,
 算法
STL 分为三类:




顺序容器
vector 直接访问任意元素,快速插入,删除尾部元素
deque 直接访问任意元素,快速插入,删除头部和尾部元素
list 快速插入,删除任意位置元素


*vector数据以附加方式插入,效率高,但如果在任意位置(除了尾部)插入删除,效率很低
*deque和vector类似,在两端插入删除效率高,内部进行插入删除效率低
*list 使用于频繁在中间进行插入删除操作
vector额外开销小,deque稍高,list最高


共同函数
assign(n,elem) 指点元素的N份拷贝加入到容器,拷贝前容器的元素被删除
assign(beg,end) 赋值从迭代器beg到end之间的元素,赋值前容器的元素被清空
push_back(elem) 附加到容器
pop_back() 删除容器尾元
front() 返回首元素
back() 返回容器尾元素
insert(position,elem) 将元素插入到容器指定位置,position 为迭代器




vector特有函数
vector(n,element) 构造向量,填入指定元素的N份拷贝
vector(veg,end) 构造一个向量,用迭代器beg到end之间的元素进行初始化
vector(size) 构造一个指定规模的向量
at(index):dataType 返回指定位置的元素


deque特有的函数
deque(n,elem)
deque(beg,end)
deque(size)
at(index):dataType
push_front(element) 将元素插入到队首
pop_front():dataType 删除队首元素




list 特有的函数
list(n,elem)
list(beg,end)
list(size)
push_front(elem)
pop_front():dataType
remove(elem) 删除列表所有与指定元素相等的元素
remove_if(oper) 删除所有令oper(elem)为真的元素
splice(pos1,list2)    将list2中所有元素剪切到列表指定位置,调用函数后,list2为空
splice(pos1,list2,beg,end) 将list2中beg到end元素剪切到列表指定位置,调用函数后,list2为空
sort() 升序排序
sort(oper) 排序,标准由oper指定
merge(list2) 假定列表和list2都已排序,将list2合并到本列表,list为空
merge(list2,oper)
reverse() 反转本列表








关联容器
set 快速查询元素,无重复关键字
multiset 与set相同,允许重复关键字
map 关键字/值对映射,不允许关键字重复,使用关键字快速查找
multimap 与map相同允许关键字重复


关联容器共同函数
find(key)
lower_bound(key)
upper_bound(key)
count(key)


set:








容器适配器
stack 后进先出容器
queue 先进后出
priority_queue 高优先级元素先删除


stack():
push(elem) 将元素添加到杖顶
pop() 删除杖顶元素
top() 返回栈顶元素
size()
empty() 若杖空,返回真




queue:
push(elem)
pop()
front()
back()
size()
empty()


顺序容器,关联容器 称为一级元素


所有容器的共同函数
无参构造函数
有参数构造函数
拷贝构造函数
析构函数
empty()
size() 返回容器元素个数
运算符= 将一个元素复制到另一个元素
关系运算符(<,<=,>,>=,==,!=)


一级容器共同函数
c1.swap(c2) 交换两个容器C1和C2中的元素
max_size() 返回容器可容纳最大元素数目
clear() 删除容器中所有元素
begin() 返回容器首元素的迭代器
end() 返回容器尾元素之后位置对应的迭代器
rbegin() 返回容器尾元素的迭代器用于逆序遍历
rend() 返回容器首元素之前位置的迭代器
erase(beg,end) 删除容器从beg到end-1之间的元素,beg,end都是迭代器




迭代器:
vector<int>::iterator itvec; //声明一个迭代器
itvec++; //将迭代器移到下一个元素
*itvec; //返回迭代器所指向的元素


迭代器类型:


输入迭代器 input iterator:用于从容器读取元素,每一步只能沿前移动一个元素
输出迭代器 output iterator: 用于向容器中写入一个元素,每一步只能沿前移动一个元素
向前迭代器 forward iterator: 包含输入输出迭代器所有的功能,
双向迭代器 bidrectioal iterator: 包含向前迭代器的所有功能,还有向后移动的能力。可自由选择向前向后
随机访问迭代器 random-access iterator: 包含双向迭代器功能,具有按任意顺序访问任意元素的能力


STL容器 支持的迭代器类型
vector 随机访问
deque 随机访问
list 双向
set 双向
multiset 双向
map 双向
multimap 双向
stack 不支持迭代器
queue 不支持
priority_queue 不支持


迭代器运算符
所有: ++p,p++
输入迭代器: *p/p1==p2/p1!==p2/
输出迭代器: *p
双向迭代器: --p/p--
随机访问迭代器:
p+=i p-=ip+i p-ip1</<=/>/>=p2
p1[i]




预定义迭代器:
vector<it>::iterator it;
iterator:
const_iterator:和iterator一样,差别:const_iterator是只读的
例如:
          vector<int> vec;
 vec.push_back(10);
 vector<int>::iterator it=vec.begin();
 vector<int>::const_iterator cit=vec.begin();

 *it=12; //OK
 *cit=13;//错


反向迭代器:
reverse_iterator
const_reverse_iterator


istream_iterator
ostream_iterator


向量和集合的迭代器使用


#include <QCoreApplication>
#include <iostream>
#include <vector>
#include <set>


using namespace std;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    vector<int>intvec;
    intvec.push_back(1);
    intvec.push_back(2);


    vector<int>::iterator itvec; //声明一个迭代器
    for(itvec=intvec.begin();itvec!=intvec.end();itvec++)
        cout<<*itvec<<" ";


    set<int>intset;
    intset.insert(3);
    intset.insert(6);
    intset.insert(9);
    set<int>::iterator itset;
    for(itset=intset.begin();itset!=intset.end();itset++)
        cout<<*itset<<" ";


    return a.exec();
}




STL算法:
非修改性算法:不改变容器内容,只是从容器获取信息
adjacent_find findlower_bound searchbinary_search find_endmismatch search_n
count find_first_ofmismatch search_ncount_if find_if
max_element upper_boundequal for_eachmin equal_range
includes min_element




修改性算法:插入,删除,重排等操作改变容器内容
copy....


数值算法:  accumulate adjacent_differenceinner_product partial_sum


堆算法:用于创建堆,从堆中删除元素,向堆插入元素以及排序堆 make_heap pop_heap push_heap sort_heap


copy函数:用于将一个容器的元素复制到另一个容器
template<typename inputIterator,typename outputIterator>
outputIterator copy(InputIterator begin,inputIterator end,outputIterator targetPossition)
函数将源容器 begin .. end-1 间的元素复制到容器targetPosition 起始位置,begin,end ,targetPosition
都是容器迭代器,函数返回指向复制的最后一个元素之后位置的迭代器


提示:copy函数将数据元素从容器写入输出流是一种很方便的方法
警告:目标容器元素包含个数>=源容器元素个数,否则,导致运行时出错


fill和fill_n
fill
用于将制定值填入容器beg至end-1之间的元素中,覆盖掉填入位置的值
void fill(ForwardIterator begin,ForwardIterator end,&value)
fill_n
用于将制定值填入容器beg至beg+n-1之间的元素中,覆盖掉填入位置的值
void fill(ForwardIterator begin,size n,&value)


generate和generate_n
将函数返回值填写容器中的元素序列
void generate(ForwardIterator beg,ForwardIterator end,function gen);
void generate(ForwardIterator beg ,size n,function gen);


remove,remove_if,remove_copy,remove_copy_if
删除元素序列中给点值value匹配的元素


replace,replace_if,replace_copy,replace_copy_if
将序列中所有给定相等的元素替代为新值




find,find_if,find_end,find_first_of




serach,serach_n




sort,vinary_search




adjacent_find,merge,inplace_merge


reverse,reverse_copy


rotate,rotate_copy




swap,iter_swap,swap_ranges


count,count_if


max_element,min_element


random_shuffle


for_each,transform


includes,set_union,set_differrenc,set_intersection,set_symmetric_difference


accumulate,adjacent_difference,inner_product,partial_sum





























0 0
原创粉丝点击