拓冰建站拓冰建站
首页 / 资讯中心 / 正文

初识STL:string1

1.STL简介1.1介绍STL是c标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包含数据结构和各种常见算法的软件框架1.2STL的六大组件容器算法迭代器仿函数空间配置器配接器其中容器就是我们之前学过的数据结构,* 仿函数,配接器,空间配置器我们之后详细讲解 *,算法包含一些常用算法,比如逆置,交换等等.我们之前自己实现过各种数据结构,每种数据结构都有截然不同的遍历方式,如果每个结构在库中都有一个自己的遍历函数那也太麻烦了.这就是迭代器的作用之一:每个数据结构都有一个迭代器组件用来遍历数据,那么如果在一个算法中需要遍历,传递迭代器模板就可以了.这就使得容器 算法相互脱离,降低耦合度,算法更加通用2.迭代器,auto和范围for2.1.迭代器的使用begin()和end()函数begin和end用来确定迭代器的遍历范围,值得注意的是这两个函数都有一个const成员函数重载:const修饰成员函数确保此函数不会修改调用它的对象.虽然只写一个const类型就够用—不管是普通对象还是const对象都可以调用,编译器允许权限的缩小,会把普通类型变成const修饰类型.但是如果我传递一个普通对象希望在函数中能修改结果却调用了const函数,这是不合理的.因此设置重载,各自调用各自的.其他begin和end虽然在string中为迭代器写了很多begin和end,但是常用的只有普通迭代器和反向迭代器:iterator本身不能被const修饰,因为迭代器想要遍历就需要,所以取名叫const_iterator.rbegin和rend会分别得到末尾和开头从后往前遍历.2.2.auto与范围for相比迭代器来讲范围for方便很多,不需要主动调用范围也不用在循环中遍历.3.string的常用接口3.1构造函数构造中比较常用的是无参默认构造,字符串构造和拷贝构造第三种构造方式中的npos是string中的一个静态成员变量,存储int的最大值,因为构造时开不了这么大的空间.所以当不传递长度的时候就会使用缺省值npos,将pos位置之后的值全部拷贝(同理当传递的长度大于实际长度时不会报错,也会只拷贝到结束)3.2赋值重载3.3string::sizesize_t size() const;用于计算返回一个对象的长度.string::lenth和它的用途一样,只是人们认为这个函数名不通用(string存储字符串,可以叫做长度,但是像树,图等这些结构叫做长度不太合适)3.4string::max_size用于返回一个字符串中可能存储的理论最大值,但是没有什么实际意义,约等于2G,实际上开不出这么大的空间.3.5string::push_back和之前顺序表的原理一样,在每一次尾插的时候都会检查空间是否足够,不够的话会进行扩容.在vs编译器下除了第一次扩容是二倍,之后都是1.5倍扩大空间,而在Linux系统下是2倍扩大.string::capacity函数用于查看当前开辟的空间.3.6operator[]operator[]是更适合string使用的遍历修改方式,类似于普通数组的下标访问3.7operatoroperator用来在字符串后面追加字符,支持传递string对象,字符串以及单个字符.3.8appendappend也是在字符串末尾继续追加字符,提供了一系列重载,但是相比于并不常用.3.9insert一个插入函数,重载了多样的插入方式,下面只介绍几种常用类型3.10replace提供多种重载的替换函数3.11eraseerase用于删除指定位置长度的数据,如果不传值就默认全部删除,迭代器版本的暂时不详细展开3.12assign使用来源对象的内容替换调用对象内容3.13eraseerase用来删除指定长度的数据,如果传递范围过长或不传递范围使用缺省值npos,就会直接删除到末尾4.有关空间的string接口4.1resizeresize用来设置字符串长度4.2reservereserve是一个调整空间大小的函数.如果要扩大当前空间,编译器绝大多数情况下会执行异地扩容(开辟一块新空间,拷贝数据,释放旧空间),不过由于一些对齐,编码原因,实际扩容出的大小要比需求的大一些.如果我们能提前知道某个对象最多需要多少空间就可以提前使用reserve把空间开出来,减少后续的扩容次数提高效率.如果传递的值比空间小,也就是说想要让编译器缩容.这种情况是不被约束的,编译器的行为大多都是无视该指令,什么都不做,如果想要缩容需使用专门提供的shrink_to_fit函数.缩容的过程是开辟新的小空间,(语法不允许部分释放空间,只能整块释放)拷贝部分数据,释放原空间,消耗不必扩容小,这是一种用时间换空间的低效策略.并且在缩容后如果添加数据就又会立即扩容,使得消耗更大.如果不是空间实在紧缺,尽量避免缩容行为4.3shrink_to_fit缩容函数,会将空间缩减到size大小.但是这个函数也是一种不受约束的行为,编译器会尽力缩小到size,但也可能比size稍大一点.不推荐使用该函数.4.4clear删除对象中的内容,将size变为0,空间不变4.5empty检查字符串是否为空(size0),为空则返回true,否则返回false5.其他比较常用的成员函数5.1c_strc_str用于一些特殊情况下,比如只提供c语言接口无法调用string的时候用c_str返回char*指针进行读取等操作5.2copy把调用对象中从pos位置开始的len长度内容拷贝到数组s中,用的很少.5.3findfind是一个很常用的查找函数.找不到的时候会返回-1,但是由于返回类型是size_t,所以会变成int的最大值.strings3(Searches the string for the first occurrence);size_t i5s3.find( );while(i5!string::npos)//npos是静态成员变量,访问时需要突破类域{s3.replace(i5,1,%%);i5s3.find( ,i5);}couts3endl;//这样写需要大量移动 太费时间string s4;for(autoch:s3)//范围for{if(ch! ){s4ch;}else{s4%%;}}autoit1s3.begin();//迭代器while(it1!s3.end()){if((*it1)! ){s4(*it1);}else{s4%%;}it1;}for(size_t i0;is3.size();i)//下标访问{if(s3[i]! ){s4s3[i];}else{s4$$;}}couts4endl;//以上三种遍历方法都可以达到目的,空格替换成%%5.4rfindrfind是从后往前寻找.参数pos是从后往前开始的位置strings3(Searches the string for the first occurrence);strings4( );size_t i5s3.rfind(s4);while(i5!string::npos){s3.replace(i5,1,%%);//i5 s3.rfind(s4,i5); size_t rfind (const string str, size_t pos npos) const//i5 s3.rfind( , i5); size_t rfind (const char* s, size_t pos npos) const//i5 s3.rfind( , i5, 1); size_t rfind (const char* s, size_t pos, size_t n) consti5s3.rfind( ,i5);//size_t rfind (char c, size_t pos npos) const}couts3endl;5.5find_first_of5.6find_first_not_of5.7substrsubstr和构造函数的某一个重载功能类似,将调用对象从pos位置开始长度len的字符串作为一个新字符串返回5.8operator注意到operator是一个全局函数,这是为了解决成员函数第一个参数固定为调用对象的问题,全局函数的第一个参数就可以是const char*5.9getline流插入cin的性质类似scanf,读取到空格就停下,如果我们想要读取一行就可以用getline(getline是一个全局函数)getline的重载还支持在遇到特殊符号时停止
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门