STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应用框架,高度体现了软件的可复用性。
1.STL简介
STL最初由惠普实验室开发,并于1998年被定义为国际标准,正式成为C++语言的标准库。在STL中采用了泛型编程的方法,泛型编程是通过模板来实现算法源代码,并将其用于不同数据类型的软件重用方法。从根本上说,STL是一些容器、算法和其他一些组件的集合,这些容器有list,vector,set,map等。STL已经是标准化组件,在使用时不需要重新开发,直接使用现有的组件。因此,使用STL编写程序会更加容易和高效。
在C++标准中,STL被组织成下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。通常STL中最重要的是算法和容器,而迭代器将二者统一起来,每个容器都有自己的迭代器,算法通过迭代器来定位和操纵容器中的元素。
C++标准库提供了众多的类和函数,可以完成更多的功能,当我们编写程序时,我们定义的类名和函数名可能和标准库中的某个名称相同。为了避免这种情况所造成的名称冲突,C++标准库中的一切类和函数都放在命名空间std中。
a、新的C++头文件如<iostream>包含的基本功能和对应的旧文件(<iostream.h>)相同,但头文件的内容包含在std命名空间中;
b、具有C库功能的新C++头文件具有如<cstdio>这样的名字,它们提供的内容和相应的C头文件相同,只是内容在std中。
标准STL序列容器:vector、string、deque和list。
标准STL关联容器:set、multiset、map和multimap。
更多的STL知识,可见《EFFECTIVE STL中文版:50条有效使用STL的经验 》,这里简单介绍string、vector、list和map四种。
2.string类型
与其他标准库类型一样,如果用户要使用string类型,必须包含相关头文件:
#include<string>
using std::string;
a、string对象的初始化
string s1;
cin>>s1;
string s2(s1);
string s3("abcdef");
string s4(s3,);//s4="ab"
string s5(s3.begin(),s3.begin()+);//s5="ab"
string s6(s3,,);//s6="cde"
string s7(,'x');//s7="xxxxx"
b、string对象的输入输出
string对象的输入输出与基本类型的输入输出类似,可直接使用cout、cin以及<<、>>运算符。
c、string类的基本操作
s1=s2;//赋值
s1.empty();//判断是否为空
s1.size();//字符的个数
s1[n];//位置为n的字符,从0开始计数
s+=s2;s1=s1+s2;//追加字符串
s1.insert(pos,s2);//在下标为pos的元素前插入s2表示的串
s1.insert(pos,cp,len);//在下表pos前插入cp的前n个字符
s1.c_str();//返回s1表示的字符串的首地址,char *
s1.substr(pos,n);//获得从pos开始的连续n个字符
s1.append(s2);//s2追加到s1的后面形成新串
s1.append(cp);//将字符指针cp指向的字符串追加到s1后,形成新串
s1.replace(pos,len,s2);//从pos开始的len个字符替换为s2
s1.find(s2,pos);//从pos处开始查找,返回s2在s1第一次(s2的首字符对应的)出现的位置,否则返回string::npos
s1.rfind(s2,pos);//从pos处开始查找,返回s2在s1最后一次(s2的首字符对应的)出现的位置,否则返回string::npos
s1.find_first_of(s2,pos);//从pos开始查找s2的任意字符,找到后返回第一次出现的位置
s1.find_last_of(s2,pos);//从pos开始查找s2的任意字符,找到后返回最后一次出现的位置
3.vector类型
注意:vector是一个类模板,而非数据类型
a、vector对象的初始化
vector<int> ivec;
vector<int> ivec1(ivec);//定义ivec1,并用ivec初始化
vector<int> ivec2(n,i);//包含n个值为i的元素
vector<int> ivec3(n);//包含n个元素
b、vector类常用的接口
reserve(size_type n);//设置向量长度,使其容纳n个元素,原有元素和size()不变
size_type capacity() const;//返回容量
iterator begin();//返回第一个元素的迭代器
iterator end();//返回最后一个元素的下一个元素的迭代器
reverse_iterator rbegin();//返回reversed vector的第一个元素的迭代器
reverse_iterator rend();//返回 reversed vector的最后一个元素的下一个元素的迭代器 void resize(size_type n, T x=T());//调整向量的大小,并设置每个元素的初值
size_type size();//元素数目
bool empty() const;//判断是否为空
reference at(size_type pos);//返回下标是pos的元素的引用
reference operator[](size_type pos);//返回下标是pos的元素的引用
reference front()//返回第一个元素的引用
reference back();//返回最后一个元素的引用 void push_back(const T &x);//在最后一个元素后添加新元素
void pop_back();//删除最后一个元素 void assign(const_iterator front, const_iterator last);//清空向量,连续插入迭代器front和last之间的所有元素
void assign(size_type n, const T&x=T());//清空元素,连续插入n个元素x iterator insert(iterator it, const T& x=T());//在it元素前插入x
void insert(iterator it, size_type n, const T& x);//在it元素前插入n个元素x
void insert(iterator it, const_iterator front, const_iterator last);//在it前插入front和last之间的所有元素 iterator erase(iterator it);//删除第it个元素,后续元素前移
iterator erase(iterator front, iterator last);//删除front和last之间的元素
void clear();//将容器清空
void swap(vector x);//与容器x的内容交换
c、迭代器
定义迭代器vector<T>::iterator it;迭代器类似于指针,可以使用*it来访问相应元素,容器的begin()和end()函数都是常用接口,在程序设计时注意灵活使用。
为了减少向量每次都需要申请和释放空间操作,vector容器每次在申请内存时,都会额外申请一块连续的存储区,用于存放新加入的元素,从而不必每次都为新元素重新分配一次容器。vector容器的存储状态如图:
4.map映射
map是STL总常用的一种关联容器,它提供了一对一的数据处理能力,由于这种特性,映射通常可以用来实现字典结构。
a、map构造函数
map<int, char*> mapStudent;//关键字类型为int,键值类型为char*
b、数据的插入有三种方法
用insert函数插入pair数据,pair是<utility>头文件中定义的struct,在STL中凡是“必须传回两个值”的函数,都会用到pair
mapStudent.insert(pair<int, char *>(,"one"));
用insert插入value_type数据
mapStudent.insert(map<int, char *>::value_type(,"one"));
使用数组方式插入数据
mapStudent[] = "one";
如何判断插入成功与否问题
void main()
{
map<int, char *> mapStudent;
pair<map<int, char *>::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(pair<int, char *>(, "one"));
if(Insert_Pair.second == true)
{cout<<"Success"<<endl;}
else
{cout<<"Failure"<<endl;}
}
c、map的大小:mapStudent.size();
遍历:
for(map<int, char *>::iterator iter = mapStudent.begin();iter!=mapStudent.end();iter++)
{cout<<iter->first<<" "<<iter->second<<endl;}
数据的查找:count计数关键字出现的次数,返回只能是0(没出现)或1(出现);使用find
map<int, char*>::iterator iter = mapStudent.find();
if(iter != mapStudent.end())
{cout<<"Find"<<endl;}
else
{cout<<"No"<<endl;}
数据的清空与判空:clear()和empty()
d、数据的删除,erase有三个重载函数
map<int, char *>::iterator iter;
iter = mapStudent.find();
mapStudent.erase(iter);
int n = mapStudent.erase();//删除了会返回1,否则返回0
mapStudent.erase(mapStudent.begin(), mapStudent.end());//清空map
5.list链表
list将元素按顺序储存在链表中。 与vector相比,它允许快速的插入和删除,但是随机访问却比较慢。list对象函数
assign() ;//给list赋值
begin() ;//返回指向第一个元素的迭代器
end() ;//返回末尾的迭代器
clear();// 删除所有元素
empty() ;//如果list是空的则返回true
erase() ;//删除一个元素
front() ;//返回第一个元素
back() ;//返回最后一个元素
get_allocator() ;//返回list的配置器
insert() ;//插入一个元素到list中
max_size() ;//返回list能容纳的最大元素数量
merge() ;//合并两个list ,一般是组合起两个排好序的表
splice() ;//合并两个list
pop_back();// 删除最后一个元素
pop_front() ;//删除第一个元素
push_back() ;//在list的末尾添加一个元素
push_front() ;//在list的头部添加一个元素
rbegin() ;//返回指向第一个元素的逆向迭代器
rend() ;//指向list末尾的逆向迭代器
remove() ;//从list删除元素
remove_if() ;//按指定条件删除元素
resize() ;//改变list的大小
reverse() ;//把list的元素倒转
size() ;//返回list中的元素个数
sort();// 给list排序
swap();// 交换两个list
unique();// 删除list中重复的元素
STL的各个容器之间的操作有很多近似之处,先介绍到这里。
STL标准模板库(简介)的更多相关文章
- STL标准模板库介绍
1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...
- STL学习系列一:STL(标准模板库)理论基础
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广 ...
- STL(标准模板库)理论基础,容器,迭代器,算法
基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. ...
- STL(标准模板库)基本概念
一.什么是STL STL(Standard Template Library,标准模板库)的从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),容器 ...
- C++ Templates STL标准模板库的基本概念
STL标准库包括几个重要的组件:容器.迭代器和算法.迭代器iterator,用来在一个对象群集的元素上进行遍历操作.这个对象群集或许是一个容器,或许是容器的一部分.迭代器的主要好处是,为所有的容器提供 ...
- STL标准模板库 向量容器(vector)
向量容器使用动态数组存储.管理对象.因为数组是一个随机访问数据结构,所以可以随机访问向量中的元素.在数组中间或是开始处插入一个元素是费时的,特别是在数组非常大的时候更是如此.然而在数组末端插入元素却很 ...
- STL标准模板库之vector
目录 vector容器 1)什么是vector 2)如何定义 3)常用的Vector函数 1.容量函数 2.增加函数 3.删除函数 4.迭代器 5.访问函数 6.其他函数及操作 7.算法 STL提供了 ...
- STL(标准模板库) 中栈(stack)的使用方法
STL 中栈的使用方法(stack) 基本操作: stack.push(x) 将x加入栈stack中,即入栈操作 stack.pop() 出栈操作(删除栈顶),只是出栈,没有返回值 stack.t ...
- STL 标准模板库
<vector> 可变长的数组 Vector<int>v int是一个模板参数,这样传进来的都会是int V.push_back(a)将a传进v,且放在最后一个 V.clear ...
随机推荐
- Windows平台分布式架构实践 - 负载均衡
概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)
上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...
- .Net 大型分布式基础服务架构横向演变概述
一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...
- ASP.NET从零开始学习EF的增删改查
ASP.NET从零开始学习EF的增删改查 最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...
- [原] KVM 虚拟化原理探究(4)— 内存虚拟化
KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...
- css3制作旋转动画
现在的css3真是强大,之前很多动画都是用jq来实现,但是css3制作的动画要比jq实现起来简单很多,今天呢,我自己也写了一个css旋转动画和大家分享.效果如下面的图片 思路:1.制作之前呢,我们先来 ...
- 【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)
这是一个iOS项目雅黑深邃的K线的绘制. 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://git ...
- 【每日一linux命令2】命令执行顺序:
二.命令顺序: 若在 shell 内置的命令/bin 以及/usr/bin 之下都出现了命令 pwd,那当我们执行该命令时,会执行哪 一个?答案是第一优先执行 shell 内置的命令,再执行路 ...