当前位置: 首页 > news >正文

STL中string的额外操作

  • 构造string的其他方法

string s1;
string s2(s1);
string s2=s1;
string s3("value");
string s3="value";
string s4(n,'c'); //把s4初始化为由连续n个字符c组成的串
除了以上构造函数和顺序容器相同的构造函数外,string类型还支持另外三个构造函数
string s(cp,n); //s是cp所指向的数组中前n个字符的拷贝,此数组至少应该包含n个字符,n不能超过此数组中包含的字符个数

const char*p = "good"; char p1[] = { 'h','e','l','l','o' }; char p2[] = { 'h','e','l','l','o','\0' }; string s(p, 3); string ss(p); cout << "s=" << s << endl; //goo cout << "ss=" << ss << endl; //good string s1(p1); string ss1(p1, 3); string s2(p2); cout << "ss1=" << ss1 << endl; //hel cout << "s2=" << s2 << endl; //hello cout << "s1=" << s1 << endl; //hello+一堆乱码 string s3(p2, 100); cout << "s3=" << s3 << endl; //hello+一堆乱码

当我们从一个const char*(或char*)通过拷贝创建string时,指针指向的数组必须以空字符,也就是\0为结尾,这样拷贝操作遇到空字符时则会停止,如s1则拷贝了一个没有以空字符结尾的字符数组、s3则传递了一个大于数组字符个数的参数,则俩者的行为是未定义的,所以打印出的结果就会出现一些乱码

string s(s2,pos); //s是string s2 从下标pos开始的字符的拷贝,若pos>s2.size(),构造函数未定义
string s(s2,pos,len); //s是string s2 从下标pos开始len个字符的拷贝,若pos>s2.size(),构造函数未定义,不管len的值是多少,构造函数至多拷贝s2.size()-pos个字符

  • substr操作

s.substr(pos,n) 操作返回一个string,它是原始string的一部分或全部的拷贝,可以传递给substr一个可选的开始位置和计数值,pos的默认值为0,n的默认值是s.size()-pos,即不加参数会默认拷贝整个s

string s("hello world");
stirng s2=s.substr(0,5); //从s中把从第0位开始的长度为5的字符串拷贝到s2(打印的值为hello)
string s3=s.substr(6); //从s中下标为6的位置拷贝到结尾
string s4=s.substr(12); //开始位置超过了string的大小,则结果未定义

  • 改变string的其他方法

string类型支持顺序容器的赋值运算以及assign、insert和erase操作,除此之外,它还定义了额外的insert和erase版本

insert、erase、assign:

s.insert(s.size(),5,'!'); //在s末尾插入5个感叹号
s.insert(0,s2,0,3); //在s[0]之前插入s2中s2[0]开始的3个字符
s.erase(s.size()-5,5); //从s删除最后5个字符

标准库string类型还提供了接受C风格字符数组的insert和assign版本

const char*cp="Stately,plump Buck";
s.assign(cp,7); //s="Stately" 从cp指向地址开始的7个字符
s.insert(s.size(),cp+7); //s="Stately,plump Buck" 将字符插入到s[size()]处元素之前的位置,也就是从s[size()]进行新元素的赋值

string s("ssss");
string s1("dddd");
s.insert(0,s1);
cout<<s<<endl; //ddddssss

string s("ssss");
string s1("dddd");
s.insert(1,s1);
cout<<s<<endl; //sddddsss

string s("ssss");
string s1("dddd");
s.insert(0,s1,0,1);
cout << s << endl; //dssss

append和replace函数:

append操作是在string末尾进行插入操作的一种简写形式
string s("ssss");
s.append("dddd"); //s.insert(s.size(), "dddd");
cout << s << endl; //ssssdddd

replace操作是调用erase和insert的一种简写形式
string s("ssssssss");
//s.erase(4, 3);
//s.insert(4, "ddd");
s.replace(4, 3, "ddd");
cout << s << endl; //ssssddds
replace函数的第二个为插入文本的长度,这个参数不是必须与第三个参数长度一样,可以插入一个更长或更短的string
s.replace(4,3,"ddddd"); //ssssddddds 在此调用中删除了3个字符,但在其插入了5个新字符

对于迭代器的操作需要特殊注意:

b,e 迭代器b和e指定的范围内的字符,迭代器e默认是尾后迭代器,所以只能拷贝到e-1所指向的元素

string s("abcdef");
string s1(s.begin(), s.end() - 3);
cout << s1 << endl; //abc
string s2 = s.assign(s.begin(), s.end() - 3);
cout << s2 << endl; //abc

  • string搜索操作

string类提供了6个不同的搜索函数,每个函数都有4个重载版本,每个搜索操作都返回一个string::size_type值,表示匹配发生位置的下标,该类型是一个unsigned类型,因此,用一个int或其他带符号类型来保存这些哈数的返回值不是一个好主意,如果搜索失败,则返回一个名为string::npos的static成员

string s("abcde");
auto pos1=s.find("a"); //pos1=0
搜索是大小写敏感的,当在string中查找子字符串时,要主意大小写
string s("abcde");
auto pos1=s.find("A"); //pos1==string::npos(一个未知数)

相关操作:

s.find(args); //查找s中args第一次出现的位置
s.rfind(args); //查找s中args最后一次出现的位置
s.find_first_of(args); //在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args); //在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args); //在s中查找第一个不在args中的字符的位置
s.find_last_not_of(args); //在s中查找最后一个不在args中的字符的位置

args必须是以下形式之一:
c,pos //从s中位置是pos的地方,开始查找字符c,pos默认为0
s2,pos //从s中位置是pos的地方,开始查找字符串s2,pos默认为0
cp,pos //从s中位置是pos的地方,开始查找指针cp指向的以空字符结尾的C风格字符串,pos默认为0
cp,pos,n //从s中位置是pos的地方,开始查找指针cp指向的数组的前n个字符,pos和n无默认值

string number("012345678"), name("r9d2"); auto pos = name.find_first_of(number); cout << pos << endl; //pos为3 即name中第一个数字的下标 string dept("03714p3"); auto pos2 = dept.find_first_not_of(number); cout << pos2 << endl; //pos2为5 搜索dept中第一个非数字字符

在字符串中循环搜索子字符串出现的所有位置:

string numbers("0123456789"); string name("r2d2"); string::size_type pos = 0; //每步循环查找name中下一个数 while ((pos = name.find_first_of(numbers, pos)) != string::npos) { cout << "found number at index:" << pos << " element is " << name[pos] << endl; ++pos; }
  • compare函数

string提供了一组compare函数,这些函数与C标准库的strcmp函数很相似,类似strcmp,根据s是=、>还是<参数指定的字符串,s.compare返回0、正数或负数

s.compare(s2); //比较s和s2
s.compare(pos1,n1,s2); //将s中从pos1开始的n1个字符与s2进行比较
s.compare(pos1,n1,s2,pos2,n2); //将s中从pos1开始的n1和字符与s2中从pos2开始的n2和字符进行比较
s.compare(cp); //比较s与cp指向的以空字符结尾的字符数组
s.compare(pos1,n1,cp); //将s中从pos1开始的n1个字符与cp指向的以空字符结尾的字符数组进行比较
s.compare(pos1,n1,cp,n2); //将s中从pos1开始的n1个字符与指针cp指向的地址开始的n2个字符进行比较

  • 数值转换

新标准引入了多个函数,可以实现数值数据与标准库string之间的转换

to_string(val) //返回数值val的string表示,val可以是任何算术类型
stoi(s,p,b) //返回s的起始子串的数值,b表示转换所用的基数,默认是10,p是size_t指针,用来保存s中第一个非数值字符的下标,p默认为0,即,函数不保存下标,返回值类型是int
stol 返回long、stoul返回unsigned long、stoll返回long long、stoull返回unsigned long long
stof(s,p) //返回s的起始子串的数值,返回类型分别是float、double或long double,参数p的作用与整数转换函数中一样
stod(s,p)、stold(s,p)

http://www.jsqmd.com/news/446552/

相关文章:

  • 2026年米兰窗帘性价比大揭秘,颜色丰富好用的产品如何选择 - 工业推荐榜
  • PNG 图片太大?几个实用的 PNG 转 WebP 在线工具推荐
  • 点云文件格式大全:从 PCD 到 LAS,你需要知道的都在这
  • 讲讲口碑好的度假酒店,贵阳溪山里酒店体验感不错美食评价高 - myqiye
  • 2026年沧州热门管道制造公司排名,河北宝温管道设备制造有限公司靠谱吗 - mypinpai
  • 深入解析:《设计模式》第二篇:单例模式
  • python: model 实体用法一样
  • 2026年上海好用的Modbus RTU转Modbus TCP厂家推荐 - 工业推荐榜
  • 2026年黑龙江自动变速箱维修推荐,费用多少钱 - 工业设备
  • [1]利用泰勒傅里叶变换对信号进行展开; [2]求原信号的动态相量参数/动态谐波参数
  • 2026年目前优秀的四边封包装袋订制厂家怎么选,三边封包装袋/四边封包装袋/八边封包装袋,四边封包装袋供货厂家哪家强 - 品牌推荐师
  • 聊聊2026年黑龙江口碑好的变速箱专修门店,专注变速箱专修源头店揭秘 - 工业品网
  • 聚焦2026新型二氧化氯发生器厂家,哪家优势明显?一体化净水器/二氧化氯发生器,二氧化氯发生器供应厂家推荐排行榜单 - 品牌推荐师
  • 2026年智能收款系统公司如何选择,实用攻略分享 - 工业品牌热点
  • 为什么十年前都不用顶流机,现在海钓人都抢着装鲨鱼妹妹? - 品牌之家
  • 一条 GROUP BY 足够了:深入理解 SAP HANA 执行计划里的 Remove Group By 简化策略
  • Jmeter断言失败则把响应内容写入到文件BeanShell后置处理器
  • Sigrity power DC的直流仿真的例子
  • 让查询飞起来的关键细节:SAP HANA 中的 Absorption 机制与 Column Search 边界扩展实战
  • Node.js最小安装
  • Python常见面试题:实现一个二叉树
  • 深入 SAP HANA Column Search:一次 IMS 调用背后的算子融合与性能密码
  • 探讨安阳商祺网络的解决方案是否有效,在郑州新乡性价比高吗 - mypinpai
  • C 盘清理综合方案:手动+命令+脚本 - 详解
  • 用 PlanViz 把 SAP HANA 性能问题拆到每一毫秒
  • 不可错过的武商一卡通回收技巧:操作简单又高效 - 团团收购物卡回收
  • 2026年聊聊包头职业学校招生报名那些事儿,选校不再迷茫 - 工业推荐榜
  • 转行IT客源专属话术
  • 纵横美术艺考靠谱不,在泉州的口碑好不好? - myqiye
  • DCS耦合器(NAT网关)应用功能