C++STL基础.docx

上传人:b****5 文档编号:11845344 上传时间:2023-04-05 格式:DOCX 页数:83 大小:555.97KB
下载 相关 举报
C++STL基础.docx_第1页
第1页 / 共83页
C++STL基础.docx_第2页
第2页 / 共83页
C++STL基础.docx_第3页
第3页 / 共83页
C++STL基础.docx_第4页
第4页 / 共83页
C++STL基础.docx_第5页
第5页 / 共83页
点击查看更多>>
下载资源
资源描述

C++STL基础.docx

《C++STL基础.docx》由会员分享,可在线阅读,更多相关《C++STL基础.docx(83页珍藏版)》请在冰豆网上搜索。

C++STL基础.docx

C++STL基础

标准C++中的string类的用法总结

相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?

的确,MFC中的CString类使用起来真的非常的方便好用。

但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?

答案是肯定的。

也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法。

其实,可能很多人很可能会忽略掉标准C++中string类的使用。

标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用。

现将具体用法的一部分罗列如下,只起一个抛砖引玉的作用吧,好了,废话少说,直接进入正题吧!

要想使用标准C++中string类,必须要包含

#include//注意是,不是,带.h的是C语言中的头文件

using std:

:

string;

using std:

:

wstring;或

usingnamespacestd;

下面你就可以使用string/wstring了,它们两分别对应着char和wchar_t。

string和wstring的用法是一样的,以下只用string作介绍:

string类的构造函数:

string(constchar*s);   //用c字符串s初始化

string(intn,charc);    //用n个字符c初始化

此外,string类还支持默认构造函数和复制构造函数,如strings1;strings2="hello";都是正确的写法。

当构造的string太长而无法表达时会抛出length_error异常;

string类的字符操作:

constchar&operator[](intn)const;

constchar&at(intn)const;

char&operator[](intn);

char&at(intn);

operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。

constchar*data()const;//返回一个非null终止的c字符数组

constchar*c_str()const;//返回一个以null终止的c字符串

intcopy(char*s,intn,intpos=0)const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目

string的特性描述:

intcapacity()const;   //返回当前容量(即string中不必增加内存即可存放的元素个数)

intmax_size()const;   //返回string对象中可存放的最大字符串的长度

intsize()const;       //返回当前字符串的大小

intlength()const;      //返回当前字符串的长度

boolempty()const;       //当前字符串是否为空

voidresize(intlen,charc);//把字符串当前大小置为len,并用字符c填充不足的部分

string类的输入输出操作:

string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。

函数getline(istream&in,string&s);用于从输入流in中读取字符串到s中,以换行符'\n'分开。

string的赋值:

string&operator=(conststring&s);//把字符串s赋给当前字符串

string&assign(constchar*s);//用c类型字符串s赋值

string&assign(constchar*s,intn);//用c字符串s开始的n个字符赋值

string&assign(conststring&s);//把字符串s赋给当前字符串

string&assign(intn,charc);//用n个字符c赋值给当前字符串

string&assign(conststring&s,intstart,intn);//把字符串s中从start开始的n个字符赋给当前字符串

string&assign(const_iteratorfirst,const_itertorlast);//把first和last迭代器之间的部分赋给字符串

string的连接:

string&operator+=(conststring&s);//把字符串s连接到当前字符串的结尾

string&append(constchar*s);           //把c类型字符串s连接到当前字符串结尾

string&append(constchar*s,intn);//把c类型字符串s的前n个字符连接到当前字符串结尾

string&append(conststring&s);   //同operator+=()

string&append(conststring&s,intpos,intn);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾

string&append(intn,charc);       //在当前字符串结尾添加n个字符c

string&append(const_iteratorfirst,const_iteratorlast);//把迭代器first和last之间的部分连接到当前字符串的结尾

string的比较:

booloperator==(conststring&s1,conststring&s2)const;//比较两个字符串是否相等

运算符">","<",">=","<=","!

="均被重载用于字符串的比较;

intcompare(conststring&s)const;//比较当前字符串和s的大小

intcompare(intpos,intn,conststring&s)const;//比较当前字符串从pos开始的n个字符组成的字符串与s的大小

intcompare(intpos,intn,conststring&s,intpos2,intn2)const;//比较当前字符串从pos开始的n个字符组成的字符串与s中

                                  //pos2开始的n2个字符组成的字符串的大小

intcompare(constchar*s)const;

intcompare(intpos,intn,constchar*s)const;

intcompare(intpos,intn,constchar*s,intpos2)const;

compare函数在>时返回1,<时返回-1,==时返回0  

string的子串:

stringsubstr(intpos=0,intn=npos)const;//返回pos开始的n个字符组成的字符串

string的交换:

voidswap(string&s2);   //交换当前字符串与s2的值

string类的查找函数:

intfind(charc,intpos=0)const;//从pos开始查找字符c在当前字符串的位置

intfind(constchar*s,intpos=0)const;//从pos开始查找字符串s在当前串中的位置

intfind(constchar*s,intpos,intn)const;//从pos开始查找字符串s中前n个字符在当前串中的位置

intfind(conststring&s,intpos=0)const;//从pos开始查找字符串s在当前串中的位置

//查找成功时返回所在位置,失败返回string:

:

npos的值

intrfind(charc,intpos=npos)const;//从pos开始从后向前查找字符c在当前串中的位置

intrfind(constchar*s,intpos=npos)const;

intrfind(constchar*s,intpos,intn=npos)const;

intrfind(conststring&s,intpos=npos)const;

//从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string:

:

npos的值

intfind_first_of(charc,intpos=0)const;//从pos开始查找字符c第一次出现的位置

intfind_first_of(constchar*s,intpos=0)const;

intfind_first_of(constchar*s,intpos,intn)const;

intfind_first_of(conststring&s,intpos=0)const;

//从pos开始查找当前串中第一个在s的前n个字符组成的数组里的字符的位置。

查找失败返回string:

:

npos

intfind_first_not_of(charc,intpos=0)const;

intfind_first_not_of(constchar*s,intpos=0)const;

intfind_first_not_of(constchar*s,intpos,intn)const;

intfind_first_not_of(conststring&s,intpos=0)const;

//从当前串中查找第一个不在串s中的字符出现的位置,失败返回string:

:

npos

intfind_last_of(charc,intpos=npos)const;

intfind_last_of(constchar*s,intpos=npos)const;

intfind_last_of(constchar*s,intpos,intn=npos)const;

intfind_last_of(conststring&s,intpos=npos)const;

intfind_last_not_of(charc,intpos=npos)const;

intfind_last_not_of(constchar*s,intpos=npos)const;

intfind_last_not_of(constchar*s,intpos,intn)const;

intfind_last_not_of(conststring&s,intpos=npos)const;

//find_last_of和find_last_not_of与find_first_of和find_first_not_of相似,只不过是从后向前查找

string类的替换函数:

string&replace(intp0,intn0,constchar*s);//删除从p0开始的n0个字符,然后在p0处插入串s

string&replace(intp0,intn0,constchar*s,intn);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字符

string&replace(intp0,intn0,conststring&s);//删除从p0开始的n0个字符,然后在p0处插入串s

string&replace(intp0,intn0,conststring&s,intpos,intn);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符

string&replace(intp0,intn0,intn,charc);//删除p0开始的n0个字符,然后在p0处插入n个字符c

string&replace(iteratorfirst0,iteratorlast0,constchar*s);//把[first0,last0)之间的部分替换为字符串s

string&replace(iteratorfirst0,iteratorlast0,constchar*s,intn);//把[first0,last0)之间的部分替换为s的前n个字符

string&replace(iteratorfirst0,iteratorlast0,conststring&s);//把[first0,last0)之间的部分替换为串s

string&replace(iteratorfirst0,iteratorlast0,intn,charc);//把[first0,last0)之间的部分替换为n个字符c

string&replace(iteratorfirst0,iteratorlast0,const_iteratorfirst,const_iteratorlast);//把[first0,last0)之间的部分替换成[first,last)之间的字符串

string类的插入函数:

string&insert(intp0,constchar*s);

string&insert(intp0,constchar*s,intn);

string&insert(intp0,conststring&s);

string&insert(intp0,conststring&s,intpos,intn);

//前4个函数在p0位置插入字符串s中pos开始的前n个字符

string&insert(intp0,intn,charc);//此函数在p0处插入n个字符c

iteratorinsert(iteratorit,charc);//在it处插入字符c,返回插入后迭代器的位置

voidinsert(iteratorit,const_iteratorfirst,const_iteratorlast);//在it处插入[first,last)之间的字符

voidinsert(iteratorit,intn,charc);//在it处插入n个字符c

string类的删除函数

iteratorerase(iteratorfirst,iteratorlast);//删除[first,last)之间的所有字符,返回删除后迭代器的位置

iteratorerase(iteratorit);//删除it指向的字符,返回删除后迭代器的位置

string&erase(intpos=0,intn=npos);//删除pos开始的n个字符,返回修改后的字符串

string类的迭代器处理:

string类提供了向前和向后遍历的迭代器iterator,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。

用string:

:

iterator或string:

:

const_iterator声明迭代器变量,const_iterator不允许改变迭代的内容。

常用迭代器函数有:

const_iteratorbegin()const;

iteratorbegin();               //返回string的起始位置

const_iteratorend()const;

iteratorend();                   //返回string的最后一个字符后面的位置

const_iteratorrbegin()const;

iteratorrbegin();               //返回string的最后一个字符的位置

const_iteratorrend()const;

iteratorrend();                   //返回string第一个字符位置的前面

rbegin和rend用于从后向前的迭代访问,通过设置迭代器string:

:

reverse_iterator,string:

:

const_reverse_iterator实现

字符串流处理:

通过定义ostringstream和istringstream变量实现,#include头文件中

例如:

   stringinput("hello,thisisatest");

   istringstreamis(input);

   strings1,s2,s3,s4;

   is>>s1>>s2>>s3>>s4;//s1="hello,this",s2="is",s3="a",s4="test"

   ostringstreamos;

   os<

   cout<

 

C++:

STL标准入门汇总

学无止境!

第一部分:

(参考XX百科)

 一、STL简介

STL(StandardTemplateLibrary,标准模板库)是惠普实验室开发的一系列软件的统称。

它是由AlexanderStepanov、MengLee和DavidRMusser在惠普实验室工作时所开发出来

的。

现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。

 

STL的代码从广义上讲分为三类:

algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类

 

组成的库来说提供了更好的代码重用机会。

在C++标准中,STL被组织为下面的13个头文件:

 

二、算法

大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。

举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比

使用整型作为它的参数类性要高。

而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用

算法。

它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。

STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。

这样一来

,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。

 

算法部分主要由头文件组成。

是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。

 

体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。

 

中则定义了一些模板类,用以声明函数对象。

 

三、容器

在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。

经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。

STL容器

就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数

允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。

 

容器部分主要由头文件,,,,,组成。

对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。

 

向量(vector)连续存储的元素

列表(list)      由节点组成的双向链表,每个结点包含着一个元素

双队列(deque)连续存储的指向不同元素的指针所组成的数组

集合(set)由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序

多重集合(multiset)允许存在两个次序相等的元素的集合

栈(stack)后进先出的值的排列

队列(queue)先进先出的执的排列

优先队列(priority_queue)元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列

映射(map)由{键,值}对组成的集合,以某种作用于键对上的谓词排列

多重映射(multimap)允许键对有相等的次序的映射

 

四、迭代器

 

下面要说的迭代器从作用上来说是最基本的部分,可是理解起来比前两者都要费力一些(至少笔者是这样)。

软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来

简化,这种简化在STL中就是用迭代器来完成的

概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。

几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。

 

迭代器部分主要由头文件,组成。

是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,

中提供了迭代器使用的许多方法,而对于的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。

  对于之前不太了解STL的读者来说,上面的文字只是十分概括地描述了一下STL的框架,对您理解STL

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1