浅谈STL

浅谈STL的理解

前言

一、STL是什么?

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。可以理解TL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。
其中STL这个"容器“‘里有很多头文件 包含以下13个
、、、、、、<memory.h>、、、、和。
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。

二、STL的组成

容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。
容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。

算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.

迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。

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

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

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

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

三、STL的使用

一、容器模板的使用

大致有下面6个步骤:

    **1.添加相应的头文件(如 #include <list> )( 注意,没有 .h )
    2.添加std命名空间(用 using namespace std; )
    3.赋予模板具体的使用类型(如 typedef list<string> LISTSTR; )
    4.实例化模板(如 LISTSTR test; )
    5.实例化游标(如 LISTSTR::iterator i; )
    6.通过迭代器对象访问模板对象,例如**

        // 逐个输出链表test中的元素
        for ( i =  test.begin(); i != test.end(); ++i )
            cout << *i << " ";

二、容器模板中的常用函数

assign() 赋值

empty() 容器为空则返回非0值

erase() 删除指定位置或指定范围内的元素

push_front() 从容器头部插入元素

push_back() 从容器尾部插入元素

pop_front() 删除第一个元素

pop_back() 删除最后一个元素

back() 返回最后一个元素的引用

front() 返回第一个元素的引用

begin() 返回指向第一个元素的游标 (与迭代器配合使用)

end() 返回指向最后一个元素的后一个位置的游标 (最后1个元素再加1) (与迭代器配合使用)
二、容器模板中的常用函数

assign() 赋值

empty() 容器为空则返回非0值

erase() 删除指定位置或指定范围内的元素

push_front() 从容器头部插入元素

push_back() 从容器尾部插入元素

pop_front() 删除第一个元素

pop_back() 删除最后一个元素

back() 返回最后一个元素的引用

front() 返回第一个元素的引用

begin() 返回指向第一个元素的游标 (与迭代器配合使用)

end() 返回指向最后一个元素的后一个位置的游标 (最后1个元素再加1) (与迭代器配合使用)

四、STL之string

1 我感觉在STL中的string类似与c语言中的数组 并且比c语言里面的数组更加灵活,定义在头文件。
2 在c++中cin不能读入字符串的空格等字符 读入时可以写为getline(cin,a) ps:a为定义的数组,定义二维数组时可以定义为string a[N].
3 之所以说string灵活,是因为不用考虑定义数组的边界问题,并且string中可以很方便的查看成员的数据如;
查找find,拷贝copy,删除delete 替换replace,插入insert
string的一些用法
int max_size()const; //返回string对象中可存放的最大字符串的长度
int size()const; //返回当前字符串的大小
int length()const; //返回当前字符串的长度
bool empty()const; //当前字符串是否为空
int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置
int rfind(char c, int pos = npos) const;//从pos开始从后向前查找字符c在当前串中的位置iterator erase(iterator first, iterator last);//删除[first,last)之间的所有字符,返回删除后迭代器的位置

实践操作如下(示例):
find和rind

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	string a;
	int t1,t2;
	cin>>a;
	t1=a.find('c');//在字符串a中寻找字符c第一次出现的位置 
	t2=a.rfind('c');//在字符串a中从后往前寻找字符c第一次出现的位置
	cout<<"c从前往后第一次出现的位置"<<t1<<endl<<"c从后往前第一次出现的位置"<<t2;
	return 0;
 } 

输出为

abccecd
c从前往后第一次出现的位置2
c从后往前第一次出现的位置5
--------------------------------
Process exited after 14.4 seconds with return value 0
请按任意键继续. . .

查找字符串长度的size

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	string a;
	int t;
	cin>>a;
	t=a.size();
	cout<<"字符串长度为"<<t;
	return 0;
 } 
**输出**
 isaldfhas
字符串长度为9

*将字符串逆序函数reverse

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
	string a;
	getline(cin,a);//cin输入时不能读入空格之类的字符 函数getline可以 
	reverse(a.begin(),a.end());//reverse对字符串取反 再头文件algorithm中
	for(int i=0;i<a.size();i++)
	cout<<a[i];
	return 0;
 } 
ldkfsjdaf  dfsdakl;fj  dsafo;jsda  sdl;f
 f;lds  adsj;ofasd  jf;lkadsfd  fadjsfkdl

五,STL之vector

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
可以理解为vector是一种可以存储任意类型的动态数组,属于序列式容器,可以用sort对其进行排序,底层数据结构是数组,可以随机访问元素。

总结

写的好水,好多都不太理解 感觉写题用的比较多的还是string 感觉挺方便的
vector还是不太明白

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值