C++ STL容器简单介绍

一、STL介绍

STL,中文通常称为标准模板库或者泛型库,由有大量的模板类和模板函数组成,是C++提供的一个基础模板的集合,用于完成诸如不同类型数据的输入/输出、计算等功能。

STL最初由惠普实验室开发,于1998年被定为国际标准,正式成为C++程序库的重要组成部分。值得一提的是,如今STL已完全被内置到支持 C++ 的编译器中,无需额外安装,这可能也是STL被广泛使用的原因之一。

STL 也是一些容器、算法和其他一些组件的集合,所有容器和算法都是总结了几十年来算法和数据结构的研究成果,汇集了许多计算机专家学者经验的基础上实现的,因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。

根据上面介绍,大致了解STL是干什么的了,我们不需要去学习函数实现原理,而是去学会用它并玩出花样来。

下面的一个小例子就可看出标准模板的实用简便。

vector <int> a; //定义a数组,当前数组长度为0,采用标准模板库建立的数组 a 可以根据存储数据的数量自动变长。
//向数组 a 中添加 10 个元素
for (int i = 0; i < 10 ; i++)
    a.push_back(i);
//还可以手动调整数组
a.resize(100);
a[90] = 100;
//直接删除数组a中所有的元素,此时a的长度变为 0
a.clear();
//可以重新调整 a 的大小为 10,并存储10个1元素。
a.resize(10, 1);

二、6大组件

STL 提供了六大组件,彼此之间可以组合套用。

1、容器:如常见的 vector、list、deque、set、map 等,用来存放数据,STL容器可看做是一种类模板。

2、算法:各种常用的算法,如 sort(排序)、find(查找)、copy(拷贝)、for_each(遍历)。这种算法是一种函数模板。

3、迭代器(本质还是指针):扮演了容器与算法之间的转换器,共有五种类型,从实现角度来看,迭代器是一种将 operator* , operator-> , operator++,operator–等指针相关操作予以重载的类模板。可以通过同一操作不同容器和不同类型的数据。所有 STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。

4、仿函数:行为类似函数,可作为 算法的某种策略。从实现角度来看,仿函数是一种重载了 operator()的 class(类) 或者 class template(类模板)

5、适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。

6、空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间 配置、空间管理、空间释放的 class tempalte.

STL 六大组件的交互关系:
容器通过空间配置器取得数据存储空间,算法通过迭代 器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

三、vector动态数组

vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素。

#include <vector>//头文件

vector<int> a; //定义了一个名为a的存int数据的一维数组
vector<double> a;//定义了一个名为a的存double数据的一维数组
vector<node> a;//node是结构体类型

vector<int> b(n);//定义一个长度为n的数组,动态定义,不指定初值默认初值为0
vector<int> b(n, 0);//所有的元素均为0
//注意:指定数组长度之后(指定长度后的数组,就不能自动改变长度了)

vector<int> a{1, 2, 3, 4, 5};//指定参数初始化

vector<int> b(a);//拷贝,a为数组名

//访问数组

//方式一:单个访问,假设a数组中已经有了5个元素
cout << a[4] << endl;  //输出第五个数据。二维数组同理


//方式二:遍历
for(int i = 0; i < num.size(); i++)
	cout << num[i] << " ";

//方式三:智能指针
for(auto i : num)
	cout << i << " ";

方法函数(来自博主行码棋)

c为数组名

 四、stack

先入栈后出栈,后入栈先出栈。可使用两个栈达到先进先出的目的。

#include <stack>

//声明
stack<int> s;
stack<string> s;
stack<node> s;//node是结构体类型

//成员函数
s.push();//压栈
s.pop();//移除栈顶元素
s.top();//取得栈顶元素
s.empty();//检测栈内是否为空,空为真
s.size();//返回stack内元素的个数

五、queue队列

先进先出,后进后出,跟排队一样。

//头文件
#include <queue>

//定义初始化
queue<int> q;


//成员函数
q.front();//返回队首元素
q.back();//返回队尾元素 
q.push();//尾部添加一个元素副本 进队
q.pop();//删除第一个元素 出队
q.size();//返回队列中元素个数,返回值类型unsigned int 
q.empty();//判断是否为空,队列为空,返回true

六、map映射

映射类似于函数的对应关系,每个x对应一个y,而map是每个键对应一个值。

如:学习对应敲代码

//头文件
#include <map>


//初始化定义
map<string,string> m;
map<string,int> m;
map<int,node> m;

//成员函数
m.find(key);//返回键为key的映射的迭代器,当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回m.end()
m.erase(it);//删除迭代器对应的键和值
m.erase(key);//根据映射的键删除键和值
m.erase(first,last);//删除左闭右开区间迭代器对应的键和值
m.size();//	返回映射的对数
m.clear();//清空map中的所有元素
m.insert();//插入元素,插入时要构造键值
m.empty();//如果map为空,返回true,否则返回false
m.begin();//返回指向map第一个元素的迭代器(地址)
m.end();//返回指向map尾部的迭代器(最后一个元素的下一个地址)
m.rbegin();//返回指向map最后一个元素的迭代器(地址)
m.rend();//返回指向map第一个元素前面(上一个)的逆向迭代器(地址)
m.count(key);//查看元素是否存在,因为map中键是唯一的,所以存在返回1,不存在返回0
m.lower_bound();//返回一个迭代器,指向键值>= key的第一个元素
m.upper_bound();//返回一个迭代器,指向键值> key的第一个元素



//添加元素

m["学习"] = "敲代码";
m["休息"] = "玩派派";

m.insert(make_pair("vegetable","蔬菜"));
m.insert({"hahaha","wawawa"});
m.insert(pair<string,string>("fruit","水果"));


//访问
//单个
m["学习"] = "敲代码";
cout << m["休息"] << endl;//一个小例子,不完整


//遍历
for(auto i : mp)//智能指针访问
cout << i.first << " " << i.second << endl;//键,值





七、set集合

set容器中的元素不会重复,当插入集合中已有的元素时,并不会插入进去,而且set容器里的元素自动从小到大排序。

#include <set>

//初始化定义
set<int> s;

//成员函数
s.begin();//返回set容器的第一个元素的地址(迭代器)
s.end();//返回set容器的最后一个元素的下一个地址(迭代器)
s.rbegin();//返回逆序迭代器,指向容器元素最后一个位置
s.rend();//返回逆序迭代器,指向容器第一个元素前面的位置
s.clear();//删除set容器中的所有的元素,返回unsigned int类型
s.empty();//判断set容器是否为空
s.insert();//插入一个元素
s.size();//返回当前set容器中的元素个数
erase(iterator);//删除定位器iterator指向的值
erase(first,second);//删除定位器first和second之间的值
erase(key_value);//删除键值key_value的值	
s.find(元素);//查找set中的某一元素,有则返回该元素对应的迭代器,无则返回结束迭代器
s.lower_bound(k);//返回大于等于k的第一个元素的迭代器
s.upper_bound(k);//返回大于k的第一个元素的迭代器

 八、string

string是一个字符串类,和char型字符串类似。可以把string理解为一个字符串类型,像int一样可以定义。

#include <string>


string str1; //生成空字符串

string str2("123456");

string str3("123456", 0, 3);//结果为"123" ,从0位置开始,长度为3

string str4("123456", 5); //结果为"12345" ,长度为5

string str5(5, '1'); //结果为"11111" ,构造5个字符'1'连接而成的字符串

string str6(str2, 2); //结果为"3456",截取第三个元素(2对应第三位)到最后



//获取字符串长度。注:程序并不完整。
str2.size()和length();//返回string对象的字符个数,他们执行效果相同。
str2.max_size();//返回string对象最多包含的字符数,超出会抛出length_error异常
str2.capacity();//重新分配内存之前,string对象能包含的最大字符数

//插入
str2.push_back();//在末尾插入例:str2.push_back(‘a’)	末尾插入一个字符a
str2.insert(pos,element);//在pos位置插入element 例:str2.insert(s.begin(),‘1’)	在第一个位置插入1字符
str2.append(str);//在syr2字符串结尾添加str字符串例


//删除
str2.erase(iterator p);//删除字符串中p所指的字符
str2.erase(pos, len);//删除字符串中从索引位置pos开始的len个字符
str2.clear();//删除字符串中所有字符

//替换
str2.replace(pos,n,str);//把当前字符串从索引pos开始的n个字符替换为str
str2.replace(pos,n,n1,c);//把当前字符串从索引pos开始的n个字符替换为n1个字符c

tolower(str2[i]);//转换为小写
toupper(str2[i]);//转换为大写

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值