STL在程序设计竞赛中的应用

STL简介

} STL = Standard Template Library, 标准模板库 , 惠普实验室开发的一系列软件的统称 .
} 这里的容器和算法的集合是世界上很多聪明人很多年的杰作 .
} STL 可分为容器 (containers) 、迭代器 (iterators) 、空间配置器 (allocator) 、配接器 (adapters) 、算法 (algorithms) 、仿函数 ( functors ) 六个部分
} 几个你必须要关注的网址:
http://www.cplusplus.com/reference/stl/
http://zh.cppreference.com/
} 所有内容均可以于这两个网站找到应用实例

STL中的几个基本概念

} 容器:可容纳各种数据类型的数据结构。
}
} 迭代器:可依次存取容器中元素的东西
}
} 算法:用来操作容器中的元素的函数模板。例如, STL sort() 来对一个数组中的数据进行排序,用 find() 来搜索一个 list 中的对象等。

sort 的使用

} 对数组使用 sort 排序
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
	int a[5];
	for(int i=0; i<5; i++) scanf("%d",&a[i]);
	sort(a,a+5);     //默认从小到大排
	for(int i=0; i<5; i++) printf("%d ",a[i]);
} 

多关键字排序

struct node{
	int x,y;
}p[4];  //定义结构体
bool cmp(node a,node b){
	if(a.x==b.x) return a.y<b.y;
	return a.x<b.x;
}   //自定义比较函数,x为主要关键字,y为次要关键字
int main()
{
	for(int i=0; i<4; i++) scanf("%d%d",&p[i].x,&p[i].y);
	sort(p,p+4,cmp);    
                //参数分别为起始位置,终止位置后一个位置,自定义比较函数
	for(int i=0; i<4; i++) printf("%d %d\n",p[i].x,p[i].y);
}

STL标准容器类简介

名称

准容器类

说明

顺序性容器

字符串

string

提供了比c语言更多的接口,使用起来也比c++方便的多

动态数组

vector

从后面快速的插入与删除,直接访问任何元素

双端队列

deque

从前面或后面快速的插入与删除,直接访问任何元素

列表

list

双链表,从任何地方快速插入与删除

关联容器

集合

set

快速查找,不允许重复值

多重集合

multiset

快速查找,允许重复值

映射

map

一对一映射,基于关键字快速查找,不允许重复值

多重映射

multimap

一对多映射,基于关键字快速查找,允许重复值

容器适配器

stack

后进先出

队列

queue

先进先出

优先队列

priority_queue

最高优先级元素总是第一个出列

字符串 string

stringc++中表示字符串的容器,其底层的字符串表示方式仍然是以’\0’表示的字符串集合但是提供了比c语言更多的接口,使用起来也比c++方便的多。

常用:字符串模拟

string的基本操作

基本操作

具体实现

新建

string s;

字符串比较

> >= < <= == !=

尾部插入元素

s.append("***");

在指定位置前插入

s.insert(2,"abs");

从指定位置开始,删除连续的n个字符

s.erase(x,len);

位置x开始长度为len的部分,替换成str

s.replace(x,len,str);

使用下标访问元素

for(i=0;i<s.size();i++) cout<<s[i]<<endl

转换为c中的字符串

printf(“%s\n”,s.c_str());

求元素个数

s.size()

清空

s.clear()

vector的基本操作 

基本操作

具体实现

创建

vector<int>vec

创建对应迭代器

vector<int>::iterator it

尾部插入元素

vec.push_back(a)

对应位置插入元素

vec.insert(vec.begin()+i,a(i位置插入ai后面的元素后移)

删除元素

vec.erase(vec.begin()+2)  (删除vec[2])

删除最后一个元素

vec.pop_back()

使用下标访问元素

for(i=0;i<vec.size();i++) cout<<vec[i]<<endl

使用迭代器访问元素

for(it=st.begin();it!=st.end();it++) cout<<*it<<endl

求元素个数

it.size()

清空

it.clear()

e.g.

#include<iostream>

#include<cstdio>

#include<cstring>

#include<vector>

using namespace std;

int main(){

  vector<int> a;

  a.clear(); //清空

  for(int i=0; i<5; i++){

  a.push_back(i); //把元素i按顺序放到a里

  }

  for(int i=0; i<a.size(); i++) //a.size()测量a的元素个数

      printf("%d ",a[i]);

  puts("");

  vector<int>::iterator it; //vector容器指针

  it=a.begin(); //指向第一个元素

  a.erase(it+2); //删除第三个

  for(int i=0; i<a.size(); i++)

      printf("%d ",a[i]);

}
集合 set

set是一种关联式容器, 作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。需要注意的是,set不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素。

常用:可以插入很多值,去掉重复元素,并可以排序、查询

 set的基本操作

基本操作

具体实现

创建

set<int>st

创建对应迭代器

set<int>::iterator it

插入元素

st.insert(a)

删除某元素

st. erase(a)

删除迭代器指向的元素

st.erase(it)

查找元素

it=st.find(a) (返回值为一个迭代器)

查找第一个不小于目标的值

it=lower_bound(a) (返回值为一个迭代器)

查找第一个大于目标的值

it=upper_bound(a) (返回值为一个迭代器)

使用迭代器访问元素

for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl

求元素个数

st.size()

清空集合

st.clear()

 lower_boundup_bound图示

 

映射 map

map 也是一种关联式容器。在 set 基础上 , 它提供 一对一 的数据处理能力

      <关键字,关键字的映射>

比如 : 一个班级中 , 每个学生的姓名 ( 假设每个人名字都互异 ) 和成绩就存在着一一映射的关系,这个模型用 map 可以轻松描述,姓名采用 string ,成绩采用 double 类型。

        定义方式为map<string, double> stu (实现字符串到数字的映射)

     插入一个新的学生可以简单表示为stu[“张三”] = 90.5、

常用:字符串hash

map的基本操作 

 e.g.

#include<iostream>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
int main(){
	map<string,int> mp;
	mp.clear(); //清空
	string nm[]={"abc","david","lucy","abc","app","lucy"};
	int index=1;
	for(int i=0; i<6; i++) {
		if(mp[nm[i]]==0) mp[nm[i]]=index++; 
		//判断是否已经出现过,没出现过,就编号 
	} 	
	map<string,int>::iterator it; //map容器的指针 
	for(it=mp.begin(); it!=mp.end(); it++){
		cout<<it->first<<" "<<it->second<<endl; 
		//按字典序输出每个的编号 
	}
}
对于上述讲的 sort,vector,set,map 其实还有很多其他功能,刚才只是介绍了些 ACM 竞赛上常用的操作,使用 STL 的模板库能使得代码简洁,易实现,正确性高,但同时 STL 实现的效率也比自己写的函数稍慢些。
STL 是把很多强大的数据结构函数写成了模板,会使用固然重要,但也得打好基础,先把数据结构学好,不能滥用,不然对提高编程没什么好处,尤其对 ACM 竞赛来说。

      实践的重要性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值