string

       string提供字符串的功能,使用时需要引入头文件<string>,string和vector类似,vector是对数组的封装,而string是对字符串的封装。从面向对象角度来讲,C风格字符串是难以操控的。所以STL里提供了面向对象的string封装。

        string内部仍然是维护一个char型数组,并且也是以0结尾的。对外提供了字符串操作常用的函数,如append、clear、at、length等操作,并支持复制、赋值等操作,重载了必要的操作符,使用户可以以一个对象的视角;来操作字符串。下面列举几个string主要函数:

append-----附加字符串;

clear-----清空;

capacity-----容量;

size-----实际长度;

length-----实际长度,等同于size函数;

at-----按索引访问字符;

find-----查找一个字符或子串;

rfind-----从后往前查找一个字符或子串;

find_first_of-----查找匹配若干字符串中的一个字符;

find_first_not_of-----查找不匹配若干字符串的一个字符;

find_last_of-----从后往前查找,匹配若干字符串中的一个字符;

find_last_not_of-----从后往前查找,不匹配若干字符中的一个字符;

substr-----取得一个子串;

insert-----插入字符或子串;

replace-----替换字符或子串;

构造string对象可以有以下几种方式:

string str1("LiMing");          //以一个C风格字符串构造

string str2 = "WangHua";          //以一个C风格字符串构造

string str3 ("abcde",5);          //参数1是C字符串,参数2是长度

string str4;         //空字符串

string str5 = " ";          //空字符串


注意:一定不要用NULL来初始化string,否则会让程序崩溃。

1)append/clear

append用于在末尾附加若干字符或字符串,例如:

#include<stdio.h>

#include<string>

using namespace std;

int main()

{

string str;

str.apend("something else");      //附加一个字符串

str.apend("abcde",5);          //附加一个字符串:赋值前5个字符

str.apend("abcde",1,3);         //附加一个字符串,七点offset=1,长度3,即复制bcd

str.apend(2,'h');          //附加两个h字符

return 0;

}


        和vector一样当附加字符是,内部缓冲区size = capacity时会自动扩充缓冲区:先申请一块更大的内存,再把原有数据复制过去。

2)size/capacity/resize/clear/length

        string的内部存储原理和vector相同。size用于得到已经存储的字符串长度,capacity表示剩余可用长度。length和size完全相同。

        resize用于显式地设置string内部缓冲区的容量capacity,clear用于清空缓存区内的所有字符,如果希望避免append低效问题,可以事先申请一个大缓冲区。

3)at

         at用于按索引访问字符,at函数返回的是第一个reference,因为可以用at修改字符串的内容。例如:

         str.at(0) = 'K';

         char ch = str.at(0);

          string页重载了操作符[],作用与at等同,例如:str[0] = 'K';

4)字符串比较

          C风格字符串使用strcmp函数进行大小比较,而string重载了所有关系操作符,所以用起来会直观一些。

5)字符串查找

         C风格字符串用strstr函数进行子串查找,并不是太方便。string提供若干查找函数,方便里查找操作。

        find函数用于查找一个字符或子串,从左到右依次查找,知道第一次匹配时,返回匹配的位置,如果没有查找到任何匹配,则返回-1,。这里说的位置或偏移,是从0开始的,和数组下标法相同。例如:

        string str = "LiMing is doing homework";

        查找i的位置;

         int pos = str.find('i');

         源字符串str包括若干个i,第一个i出现的位置是1,所以上面的代码返回就是1.如果要接着往后查找,可以为find指定第二个参数,该参数表示起点位置偏移offset,例如;

        int pos = str.find('i',2);

        第二个参数为2,表明从位置2开始查找,在查找到str[3]时fai按匹配,所以可以返回3.

        find可以直接查找一个子串,例如:

        int pos = str.find("ing");

        从左到右查找"ing",第一次匹配时返回子串首字符的位置以下代码是在第一次查找的基础上继续往后查找相同字符串:

        int pos = str.find("ing",pos+3);

       rfind用于从右往左来查找字符或子串,没有匹配返回-1,有匹配则返回子串的首字符的位置。

       int pos = str.rfind("ing");

       pos = str.rfind("ing",pos-3);

6)substr

       substr用于复制部分字串,带两个参数:第一个参数offset表示起始位置,第二个参数len表示要截取的子串长度。第二个参数如果省略则表示一直截取到末尾。

      str src("abcdefg");

      string str1 = src.substr(4);     //返回efg

      string str2 = src.substr(4,2);     //返回ef

7)insert/replace

       insert函数用于向字符串中间插入字符或子串。

string&  insert(int pos,const char* str);    //在pos出插入str

      replace用于替换string中间的一个资产src,替换另一个子串dest。

      如果要实现删除子串,也可以借助DoReplace函数来实现,只是将目标字串长度设为0罢了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 【转载】原文地址:std::string详解作者:kieven2008 之所以抛弃char*的字符串而选用C++标...
    VAYY阅读 644评论 0 2
  • string类的构造函数: string(const char *s); //用c字符串s初始化string...
    Mr希灵阅读 398评论 0 0
  • 1、charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码。 strObj.charCodeA...
    可乐可乐请加冰阅读 432评论 0 0
  • 儿时 我用天真烂漫 编织绚丽的梦想 咯咯的笑声 传遍每一个奔跑过的村庄 稚嫩的童音和着蝉鸣 回荡 风吹树叶有哗哗...
    红叶诗阅读 135评论 0 0
  • 昨天晚上,三猫真是气死我了。不知道是白天睡了太久晚上精神了,还是不知道哪根神经厉害了,完全变成一个淘气精。 办公室...
    深井真君阅读 174评论 0 0