STL

时间:2021-10-14
本文章向大家介绍STL,主要包括STL使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. STL概论

目标:

提升复用性

尝试:

函数(functions),类别(classes),到函数库(function libraries),类别库(class libraries)、各种组件,

从模块化设计,到面向对象(object oriented )

目标:

建立数据结构和算法的一套标准,并且降低他们之间的耦合关系,以提升各自的独立性、弹性、交互操作性(相互合作性,interoperability)

结果:

STL诞生

1.1. STL基本概念

容器(container)

算法(algorithm)

迭代器(iterator)

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

摘自:

https://blog.csdn.net/weixin_41969690/article/details/106648441?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163413364316780274155669%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163413364316780274155669&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-106648441.pc_search_result_control_group&utm_term=stl%E6%98%AF%E4%BB%80%E4%B9%88&spm=1018.2226.3001.4187

 

string

//定义

    string s1;

    string s2 (s;

    string s3(s0,;

    string s4 (s0,3, ;

    string s5 ("let us learn string");

    string s6 ("let us learn string",;

    string s7 (10, 'x');

    string s8 (s0.begin(), s0.begin()+;

总结:

string(直接输入数组/已有数组名)

string(数组,开始的下标,取几个)

string(数组开始的位置,数组结束的位置)

string(几个,字符)

//操作

=,assign() //赋以新值

swap() //交换两个字符串的内容

+=,append(),push_back() //在尾部添加字符

insert() //插入字符

insert(要被插入的地方,插入的字符)

erase() //删除字符

erase(要删除的位置)

erase(要删除的第一个字符位置,要删除的最后一个字符的后一个位置)

clear() //删除全部字符

replace() //替换字符

replace(替换的下标,多少个字符被替换,替换的字符)

replace(替换的字符的开始位置,替换字符的最后一个位置的后一个位置,替换字符)

replace(替换字符的下标,多少个字符被替换,替换成多少遍个,替换字符)

size(),length() //返回字符数量

capacity() //返回重新分配之前的字符容量

reserve() //保留一定量内存以容纳一定数量的字符

copy() //将某值赋值为一个C_string

c_str() //将内容以C_string返回

data() //将内容以字符数组形式返回

substr() //返回某个子字符串

摘自:https://blog.csdn.net/lsh_2013/article/details/46728993?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163413685116780261917125%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163413685116780261917125&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-46728993.pc_search_result_control_group&utm_term=STL%E4%B9%8Bstring&spm=1018.2226.3001.4187

总结:

 

构造

添加

删除

替换

查找(find,rfind)

比较

普遍

string s;
string s("a b c");
string s(s1);
string s(n,'c');

+=
append()
push_back()

s.clear();
s.pop_back()

 

fine("a b c");
find_first(last)_of("a b")
find_first(last)_not_of("a b")

compare(s)
compare("a b")

location

 

insert(location,'c');

erase(location);

 

find('c'(,location));

 

pos,n

string s(s1,pos,n);

 

erase(pos,n);

replace(pos,n,(a,)"a b c");

 

compare(pos,n,s);

first,last

string s(s1,first,last);

 

erase(first,last);

replace(first,last,"a b c");

   

其他

size()
length()

empty()

resize()
reserve()

swap()

reverse (first,last);

遍历

for(0 - length())
s[i]

for(0 - length())
s.at(i)

string::iterator i
for(begin()-end())
*i;

sprintf、strcpy 及 memcpy

区别在于 实现功能 以及 操作对象 不同。

 

操作对象

目的

strcpy

字符串

拷贝字符串

sprintf

任意基本类型的数据

基本数据类型向字符串的转换

memcpy

任意数据类型

内存拷贝

利弊_单论拷贝字符串:

strcpy 是最合适的选择:效率高且调用方便。

sprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。

memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;(可以用来实现对结构或者数组的拷贝,目的是高效或者使用方便)

摘自:https://blog.csdn.net/grl18840839630/article/details/79672837?ops_request_misc=&request_id=&biz_id=102&utm_term=strcpy%20sprintf%20memcpy%E7%94%A8%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-79672837.pc_search_result_control_group&spm=1018.2226.3001.4187

原文地址:https://www.cnblogs.com/jihuiting/p/15405442.html