STL_string

news/2024/11/28 11:42:31/

文章目录

  • 1、string
  • 2、string的用法
    • 2.1、创建 string 对象
    • 2.2、给 string 对象赋值
    • 2.3、从 string 对象尾部添加字符
    • 2.4、从 string 对象尾部追加字符串
    • 2.5、给 string 对象插入字符
    • 2.6、访问 string 对象的元素
    • 2.7、删除 string 对象的元素
    • 2.8、返回 string 对象的长度
    • 2.9、替换 string 对象的字符
    • 2.10、搜索 string 对象的元素或子串
    • 2.11、string 对象的比较
    • 2.12、用 reverse 反向排序 string 对象
    • 2.13、string 对象作为 vector 元素
    • 2.14、string 类型的数字化处理
    • 2.15、string 对象与字符数组互操作
    • 2.16、string 对象与 sscanf 函数
    • 2.17、string 对象与数值相互转换

1、string

c语言只提供了一个char类型用来处理字符,而对于字符串,只能通过字符串数组来处理。
C++STL提供了string基本字符系列容器来处理丰富的字符串,可以把string理解为字符串类,它提供了添加、删除、替换、查找和比较等丰富的方法。
使用 string 容器,需要头文件包含声明#include <string>

2、string的用法

2.1、创建 string 对象

下面这条语句创建了字符串对象 s,s 是一个空字符串,其长度为 0:

#include <string>
#include <iostream>
using namespace std;
int main()
{string s;cout<<s.length()<<endl;return 0;
} 

2.2、给 string 对象赋值

string 对象赋值一般有两种方式。
(1)直接给字符串对象赋值,如:

#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s="hello,C++STL.";cout<<s<<endl;return 0;
} 
运行结果:
hello,C++STL.

(2)更常用的方法是,把字符指针赋给一个字符串对象:

#include <string>
#include <iostream>
using namespace std;
int main()
{string s;char ss[5000];//scanf 的输入速度比 cin 快得多//scanf 是 C 语言的函数,不支持 string 对象scanf("%s",&ss);//把整个字符数组赋值给 string 对象s=ss;//输出字符对象cout<<s<<endl;return 0;
} 
运行结果(先从键盘上输入“hello,string.”):
hello,string.
hello,string.

2.3、从 string 对象尾部添加字符

在 string 对象的尾部添加一个字符(char),采用“+”操作符即可,具体应用如下:

#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s=s+'a';s=s+'b';s=s+'c';cout<<s<<endl;return 0;
} 
运行结果:
abc

2.4、从 string 对象尾部追加字符串

从尾部追加的方式有两种。
(1)直接采用“+”操作符,代码如下:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s=s+"abc";s=s+"123";cout<<s<<endl;return 0;
}
运行结果:
abc123

(2)采用 append()方法,代码如下:

#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s.append("abc");s.append("123");cout<<s<<endl;return 0;
}
运行结果:
abc123

2.5、给 string 对象插入字符

(1)在原串下标为pos的字符前插入字符串str
  basic_string& insert (size_type pos, const basic_string& str);

#include<iostream>
#include<string>
using namespace std;
int main()
{string str="acmer";string s="oier";str.insert(1,s);//在原串下标为1的字符c前插入字符串scout<<str<<endl;return 0;
}
输出:aoiercmer

(2)str从下标为pos1开始数的n个字符插在原串下标为pos的字符前
  basic_string& insert (size_type pos, const basic_string& str, size_type pos1, size_type n);

#include<iostream>
#include<string>
using namespace std;
int main()
{string str2="hello";string s2="weakhaha";str2.insert(0,s2,1,3);//将字符串s2从下标为1的e开始数3个字符,分别是eak,插入原串的下标为0的字符h前cout<<str2<<endl;return 0;
}
输出:eakhello

(3)在原串下标为pos的字符前插入n个字符c
  basic_string& insert (size_type pos, size_type n, char c);

#include<iostream>
#include<string>
using namespace std;
int main()
{string str1="hello";char c='x';str1.insert(4,5,c);//在原串下标为4的字符o前插入5个字符ccout<<str1<<endl;return 0;
}
输出:hellxxxxxo

可以使用 insert()方法把一个字符插入到迭代器位置之前,代码如下:

#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s="123456";//定义迭代器string::iterator it;//迭代器位置为字符串首it=s.begin();//把字符'p'插入到第 1 个字符前(注意,字符位置是从 0 开始计数)s.insert(it+1,'p');cout<<s<<endl;return 0;
}
运行结果:
1p23456

2.6、访问 string 对象的元素

一般使用下标方式随机访问 string 对象的元素,下标是从 0 开始计数的。另外,string对象的元素是一个字符(char)。代码如下:

#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s="abc123456";//输出 string 对象的首元素cout<<s[0]<<endl;//两个相同的字符相减值为 0cout<<s[0]-'a'<<endl;return 0;
}
运行结果:
a
0

2.7、删除 string 对象的元素

(1)清空一个字符串,则直接给它赋空字符串即可。
(2)使用 erase()方法删除迭代器所指的那个元素或一个区间中的所有元素。

erase()是STL提供的容器中比较常用的方法之一,它的功能是删除容器中的某些元素,其中它的函数原型如下:
删除容器中从pos位置开始的n个元素
string& erase ( size_t pos = 0, size_t n = npos );

#include<iostream>
using namespace std;int main()
{string str = "hello world!";cout<<str.erase(0,1)<<endl;
}

string容器特有的erase用法:

#include <string>
#include <iostream>
using namespace std;
int main()
{string s;s="abc123456";//定义迭代器变量,指向字符串对象首元素string::iterator it=s.begin();//删除第 3 个元素,元素位置从 0 开始计数s.erase(it+3);cout<<s<<endl;//删除 0~4 区间的所有元素,左闭右开s.erase(it,it+4);cout<<s<<endl;//清空字符串s="";//输出字符串的长度cout<<s.length()<<endl;return 0;
}
运行结果:
abc23456
3456
0  

2.8、返回 string 对象的长度

采用 length()方法可返回字符串的长度;采用 empty()方法,可返回字符串是否为空,
如果字符串为空,则返回逻辑真,即 1,否则,返回逻辑假,即 0。代码如下:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="abc123456";//输出字符串的长度cout<<s.length()<<endl;//清空字符串s="";//判断字符串是否为空cout<<s.empty()<<endl;return 0;
}
运行结果:
9
1 

2.9、替换 string 对象的字符

使用 replace()方法可以很方便地替换 string 对象中的字符,replace()方法的重载函数相当多,常用的只有一两个,具体代码如下:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="abc123456";//从第 3 个开始,将连续的 3 个字符替换为“good”//即将“abc”替换为“good”s.replace(3,3,"good");cout<<s<<endl;return 0;
}
运行结果:
abcgood456

2.10、搜索 string 对象的元素或子串

采用 find()方法可查找字符串中的第一个字符元素(char,用单引号界定)或者子串(用双引号界定),如果查到,则返回下标值(从 0 开始计数),如果查不到,则返回 4294967295。
find()方法有很多重载函数,下面的代码,仅举出了一种用法。

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="cat dog cat";//查找第一个字符‘c’,返回下标值cout<<s.find('c')<<endl;//查找第一个子串“c”,返回下标值cout<<s.find("c")<<endl;//查找第一个子串“cat”,返回下标值cout<<s.find("cat")<<endl;//查找第一个子串“dog”,返回下标值cout<<s.find("dog")<<endl;//查找第一个子串“dogc”,查不到则返回 4294967295cout<<s.find("dogc")<<endl;return 0;
}
运行结果:
0
0
0
4
4294967295

2.11、string 对象的比较

string 对象可与使用 compare()方法与其他字符串相比较。如果它比对方大,则返回 1;如果它比对方小,则返回-1;如果它与对方相同(相等),则返回 0。代码如下:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="cat dog cat";//s 比“cat”字符串大,返回 1cout<<s.compare("cat")<<endl;//s 与“cat dog cat”相等,返回 0cout<<s.compare("cat dog cat")<<endl;//s 比“dog”小,返回-1cout<<s.compare("dog")<<endl;return 0;
}
运行结果:
1
0
-1

2.12、用 reverse 反向排序 string 对象

采用 reverse()方法可将 string 对象迭代器所指向的一段区间中的元素(字符)反向排序。reverse()方法需要声明头文件#include <algorithm>。代码如下:

#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{string s;s="123456789";reverse(s.begin(),s.end());cout<<s<<endl;return 0;
}
运行结果:
987654321

2.13、string 对象作为 vector 元素

string 对象可以作为 vector 向量的元素,这种用法,类似于字符串数组。代码如下:

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{vector<string> v;v.push_back("Jack");v.push_back("Mike");v.push_back("Tom");cout<<v[0]<<endl;cout<<v[1]<<endl;cout<<v[2]<<endl;cout<<v[0][0]<<endl;cout<<v[1][0]<<endl;cout<<v[2].length()<<endl;return 0;
}
运行结果:
Jack
Mike
Tom
J
M
3 

2.14、string 类型的数字化处理

ACM 竞赛中,常常需要将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会太长,这时候,我们可以将读入的数据当成字符串来处理,这样就方便、省时多了。下面这个程序演示了求一个整数各位的和:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;s="1234059";int i;int sum=0;for(i=0;i<s.length();i++){if(s[i]=='0')sum+=0;else if(s[i]=='1')sum+=1;else if(s[i]=='2')sum+=2;else if(s[i]=='3')sum+=3;else if(s[i]=='4')sum+=4;else if(s[i]=='5')sum+=5;else if(s[i]=='6')sum+=6;else if(s[i]=='7')sum+=7;else if(s[i]=='8')sum+=8;else if(s[i]=='9')sum+=9;}cout<<sum<<endl;return 0;
}
运行结果:
24 

2.15、string 对象与字符数组互操作

下面这个程序演示了字符数组与 string 对象的输入与输出:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s;char ss[100];//输入字符串到字符数组中scanf("%s",&ss);//字符数组赋值线字符串对象s=ss;//用 printf 输出字符串对象,要采用 c_str()方法printf(s.c_str());//换行cout<<endl;//用 printf 输出字符数组printf("%s",ss);//换行cout<<endl;//用 cout 输出字符串对象cout<<s<<endl;//用 cout 输出字符数组cout<<ss<<endl;return 0;
}
输出结果(从键盘输入“abc123”字符串后回车):
abc123
abc123
abc123
abc123
abc123 

2.16、string 对象与 sscanf 函数

在 C 语言中,sscanf 函数很管用,它可以把一个字符串按你需要的方式分离出子串,甚至是数字。下面这个程序演示了 sscanf 函数的具体用法:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{string s1,s2,s3;char sa[100],sb[100],sc[100];//将字符串分离成子串,分隔符为空格sscanf("abc 123 pc","%s %s %s",sa,sb,sc);s1=sa;s2=sb;s3=sc;cout<<s1<<" "<<s2<<" "<<s3<<endl;//将字符串分离成数字,分隔符为空格//当用到数字的时候,跟 scanf 一样,它要传指针地址int a,b,c;sscanf("1 2 3","%d %d %d",&a,&b,&c);cout<<a<<" "<<b<<" "<<c<<endl;//将字符串分离成数字,分隔符为“,”和“$”//当用到数字的时候,跟 scanf 一样,它要传指针地址int x,y,z;sscanf("4,5$6","%d,%d$%d",&x,&y,&z);cout<<x<<" "<<y<<" "<<z<<endl;return 0;
}
运行结果:
abc 123 pc
1 2 3
4 5 6

2.17、string 对象与数值相互转换

有时候,string 对象与数值之间需要相互转换,下面这个例子详细说明了如何完成这项工作:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
//C++方法:将数值转换为 string
string convertToString(double x){ostringstream o;if (o << x)return o.str();return "conversion error";//if error}
//C++方法:将 string 转换为数值
double convertFromString(const string &s){istringstream i(s);double x;if (i >> x)return x;return 0.0;//if error}
int main(int argc, char* argv[])
{//将数值转换为 string 的第一种方法:C 方法char b[10];string a;sprintf(b,"%d",1975);a=b;cout<<a<<endl;//将数值转换为 string 的第二种方法:C++方法string cc=convertToString(1976);cout<<cc<<endl;//将 string 转换为数值的方法:C++方法string dd="2006";int p=convertFromString(dd)+2;cout<<p<<endl;return 0;
} 

http://www.ppmy.cn/news/2574.html

相关文章

计算两个颜色相似度

1.计算两个颜色相似度的公式如下: 颜色QColor1(R1, G1, B1)转成h1,s1,v1 颜色QColor2(R2, G2, B2)转成h2,s2,v2 detah=h1-h2 detas=s1-s2 detav=v1-v2 len = qsrt(detah * detah + detas * detas + detav * detav) if (len > 1) len = 1.0 similarity = (1.0 - le…

m基于FPGA的数字下变频verilog设计

目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 整个数字下变频的基本结构如下所示 NCO使用CORDIC算法&#xff0c;CIC采用h结构的CIC滤波器&#xff0c;HBF采用复用结构的半带滤波器&#xff0c;而FIR则采用DA算法结构。 这里&#xff0c;我们…

Matlab 中 global 函数实例解析

目录 global 函数 案例分析 1 案例分析 2 使用golbal的优点 1. 传递大数据的参数 2. 过多的常量需要传递 global 函数 比如在主函数里面&#xff0c;你需要设置 Nc 这个变量是一个全局变量&#xff0c;就需要声明一下&#xff1a; global Nc; 然后在子函数里面你又用到了…

蓝桥杯比赛 NOC竞赛C++ 类、函数和指针,选择题真题和模拟题汇总答案解析

第二部分 C 类、函数和指针 1、有关类的说法不正确的是 D A&#xff09;类是一种用户自定义的数据类型. B&#xff09;只有类中的成员函数才能存取类中的私有成员. C&#xff09;在类中&#xff0c;如果不做特别说明&#xff0c;所指的数据均为私有类型. D&#…

【linux】ssh免密登录

概要 服务器免密登录实际上是基于公钥的认证&#xff0c;比如希望A服务器可以免密访问B服务器&#xff0c;则需要进行如下步骤 A服务器生成密钥对将A服务器生成的公钥分发到B服务器&#xff08;写入~/.ssh/authorized_keys&#xff09;A服务器即可免密登录B服务器 生成密钥对…

Vue学习:Vue中的数据代理

<!-- 准备容器 --><div idroot> <h2>学校名称&#xff1a;{{name}}</h2><h2>学校地址&#xff1a;{{adress}}</h2></div><script>const vm new Vue({ el: #root,data: {name:Jhon,adress:street 10},});</script> vm上…

计算机的硬件系统和软件系统的关系

计算机的硬件系统和软件系统的关系是缺一不可。 硬件它是所有软件运行的物质基础。 与硬件直接接触的是操作系统&#xff0c;它处在硬件和其他软件之间&#xff0c;表示它向下控制硬件&#xff0c;向上支持其他软件。 在操作系统之外的各层分别是各种语言处理程序、数据库管理…

【C++ unordered_set set 和 unordered_map 和 map】

文章目录前言简单介绍哈希表&#xff0c;哈希结构什么时候用哈希表unordered_map操作likou第一题 两数之和unordered_set 基础操作unordered_set 实现总结前言 今天重新打开力扣&#xff0c;看到以前的签到题两数之和&#xff0c;以前的方法是双指针暴力解法&#xff0c;偶然看…