C++/STL1. string类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++/STL1. string类相关的知识,希望对你有一定的参考价值。


  • 简单总结string类相关内容
  • string类本身不属于STL库,但是用法上有诸多相似之处,所以也放在STL分类里总结了

文章目录

  • ​​一、构造函数​​
  • ​​二、string类的常见操作​​
  • ​​(1)对象操作​​
  • ​​(2)string类函数​​
  • ​​(3)更多详细介绍​​
  • ​​三、string和char的转换​​
  • ​​四、sstream​​
  • ​​(1) sstream对象的初始化:​​
  • ​​(2) 数据类型转换​​
  • ​​(3) 字符串分割​​

一、构造函数

  1. 生成一个空字符串s :​​string s;​
string str1;
  1. 初始化为显式字符串:​​string s(“value”);​​​或 ​​string s=“value”;​
string str1("abc");
string str2="abc"; //str2=str1="abc"
  1. 拷贝构造函数生成str的副本 :​​string s(str);​
string str1("abc");
string str2(str1); //str2=str1="abc"
  1. 初始化为字符串str内 “始于位置stridx” 的部分​​string s(str, stridx);​
string str1="abcdef";
string str2(s,1); //str2 = "bcdef"
  1. 初始化为字符串str内"始于stridx且长度最多len"的部分作为字符串的初值 ​​string s(str, stridx, len);​
string str1="abcdef";
string str2(str1,1,3); //str2 = "bcd"
  1. 初始化为C字符串cstr,没有\\0的char数组可以完整赋值,若有则到\\0为止 ​​string s(cstr);​
char cstr1[5]=1,2,3,\\0,5;
char cstr2[5]=1,2,3,4,5;
string str1(cstr1); //str1 = "123"
string str2(cstr2); //str2 = "12345"
  1. 将C字符串cstr的前len个字符作为字符串s的初值。 \\0会变成空格​string s(cstr, len);​
char cstr1[5]=1,2,3,\\0,5;
char cstr2[5]=1,2,3,4,5;
string str1(cstr1,5); //str1 = "123 5"
string str2(cstr2,5); //str2 = "12345"
  1. 初始化为连续num个字符 ​​string s(num, char);​
string str1(5,a);   //str1="aaaaa"
  1. 利用迭代器,初始化为某string串str的一部分​​string s(str.begin()+n,str.end()-m);​
string str1="abcdef";
string str2(str1.begin()+1,str1.end()-1); //str2="bcde"
  1. 析构函数,销毁所有字符,释放内存 ​​s.~string();​

二、string类的常见操作

(1)对象操作

  1. ​s1+s2​​:字符串拼接,返回一个新的string串。左右可以选一边写成显式字符串形式(比如“abc”这样的)
  2. ​s1+=s2​​:字符串拼接,在s1尾部拼接s2。s2可写成显式字符串形式(没有-=​)
  3. ​s1=s2​​:s1替换为s2的副本,s2可以写成显式字符串形式
  4. ​s1==s2​​:若s1和s2相同,返回true;否则返回false
  5. ​>/>=/</<=​​:按字典顺序从前往后逐个比较,返回true或false(任意大写字母小于任意小写字母

(2)string类函数

  1. ​s.empty()​​:s为空串返回ture,否则返回false
  2. ​s.size()​​​ / ​​s.length()​​:返回s中当前字符个数
  3. ​s[n]​​​ / ​​s.at(n)​​:返回s中下标为n的字符
  4. ​s.append(str)​​​:和​​+=​​功能相同
  5. ​s.push_back(c)​​:在尾部添加一个字符(不能是字符串,只能是单个字符
  6. ​s.insert()​​:
  1. ​s.insert(2,"123")​​:在下标2位置插入显式字符串“123”
  2. ​s.insert(2,str)​​:在下标2位置插入string字符串str
  3. ​s.insert((string::size_type)0,5,A)​​:在下标0位置插入5个连续的字符’A’
  1. ​s.substr()​​:
  1. ​s.substr()​​:返回整个string串
  2. ​s.substr(2)​​:返回一个string串,是下标2到结尾部分
  3. ​s.substr(2,3)​​:返回一个string串,是下标2到下标2+3部分
  1. ​s.erase()​​:
  1. ​s.erase()​​:清空string串,同s.clear()
  2. ​s.erase(2)​​:清除串中下标2到结尾部分
  3. ​s.erase(2,3)​​:清除串中下标2到下标2+3之前左闭右开)部分
  1. ​s.clear()​​:清空串
  2. ​s.find()​​:从前往后查找
  1. ​s.find("abc",2)​​:从下标2往后找串“abc”,找到就返回起始字符下标;否则返回string::npos
  2. ​s.find(‘f’,2)​​:从下标2往后找字符“f”,找到就返回下标;否则返回string::npos
  3. 注意:如果找不到会返回 string::npos ,判断时要用这个来判断!
  1. ​s.find_last_of()​​:从后往前查找
  1. ​s.find_last_of("0123",9)​​:从下标9往前查找串“0123”中和s重合部分(和find不同),找到就返回最后一个重合部分的最后一个字符下标;(举例:如果str=“0123456789”,调用s.find_last_of("##012AB456CD",9),会返回6)
  2. ​s.find_last_of(‘0’,9)​​:从下标9往前查找字符‘0‘,返回第一个找到字符下标
  3. 注意:如果找不到会返回 string::npos ,判断时要用这个来判断!
  1. ​s.replace()​​:
  1. ​s.replace(0,2,"REPLACE");​​:把下标0到2部分替换为显式字符串
  2. ​s.replace(0,2,str);​​:把下标0到2部分替换为string字符串
  3. ​s.replace(s.begin()+n,s.end()-m,str2);​​:用迭代器方法选出被替换部分,替换为显式字符串或者string串
  4. ​s.replace(0,1,5, );​​:把下标0到下标0+1部分换成5个‘ ’空格
  5. ​s.replace(str.begin()+2,str.begin()+4,1, )​​;把下标2到下标4部分换成1个‘ ’空格
  1. ​用迭代器遍历:​
basic_string<char>::iterator s_i;
for(s_i=str1.begin();s_i!=str1.end();s_i++)
cout<<*s_i<<" ";
cout<<endl;

(3)更多详细介绍

  • string类函数重载十分多,以上没有说全,更详细请参考:​​标准C++中的string类的用法总结​​

三、string和char的转换

  1. string转换成const char*
  1. 两个成员函数可以实现:
    str.c_str()
    str.data()
  2. 这两个函数返回一个const char*指针,内容与本string串相同。这是为了与C语言兼容,在C语言中没有string类型
  3. 一定要使用strcpy()函数等来操作方法c_str()返回的指针
string str1 = "Hello World";
const char *ch1 = str1.c_str();
const char *ch2 = str1.data();
  1. const char*转string
  1. string str2(str1.c_str()); //利用string s(cstr)构造函数
  2. str2 = str1.c_str(); //利用赋值构造函数
  1. char*转string
  1. 同const char *
  1. string转char*
  1. 先转const char*,再强转char*
char *t=(char*)str1.c_str();
  1. char[]转string
  1. 直接赋值,数组中不需要’\\0’
char str[5]=1,2,3,4,5;  //不需要\\0
string str5=str;
  1. string转char[]
  1. 遍历一遍,取出每一个字符赋值
  2. ​size_type copy( char *str, size_type num, size_type index );​​copy()函数拷贝自己的num个字符到str中(从索引index开始)。返回值是拷贝的字符数,注意这样是没有‘\\0’的
char data[100];
string str="0123456789";

str.copy(data,10,0); //data[0]~data[9]为0~9

四、sstream

  • sstream库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。
  • sstream使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。
  • sstream主要用于:
    1. 字符串分割 (按空格分割)
    2. 数据类型转换

(1) sstream对象的初始化:

·用构造函数
string str="1234";
stringstream ss(str);
·用流
stringstream ss,ss2;
ss<<1<<2.3<<A<<str; //可以输入各种形式的数据,
ss>>str; //再输出为string就能把这一串都转为一个string

ss2<<123<<ss;
ss2>>str; //这里用流作为输入,转str输出会时,ss部分会拼接为其地址
cout<<str<<endl;

(2) 数据类型转换

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

//利用流将各类型数据转换为string
template<class T>
void to_string(string &result,const T& t)

ostringstream oss; //创建一个流
oss<<t; //把值传递如流中
result=oss.str(); //获取转换后的字符转并将其写入result


//利用流将任意类型转换为任意类型
template<class out_type,class in_value>
out_type convert(const in_value &t)

stringstream stream;
stream<<t; //向流中传值
out_type result; //这里存储转换结果
stream>>result; //向result中写入值
return result;


int main()

//直接转换
stringstream stream;
string result="12345";
int n=0;
stream<<result;
stream>>n; //n=12345
cout<<n<<endl;

//利用流将各类型数据转换为string
to_string<int>(result,123); cout<<result<<endl;
to_string<float>(result,12.3); cout<<result<<endl;
to_string<char>(result,A); cout<<result<<endl;
to_string<bool>(result,true); cout<<result<<endl;

//利用流将任意类型转换为任意类型
int a=convert<int,double>(3.14); cout<<a<<endl;
char b=convert<char,int>(69); cout<<b<<endl;
float c=convert<float,string>("12.3"); cout<<c<<endl;
  • 在做类型转换的时候,最好重复利用一个sstream流,因为构造这个对象比较慢
    但是要注意两次转换直接必须调用stream.clear(); 这会清除标志位,保证转换正确
    但是只调用 stream.clear(); 并没有释放strem占用的内存(可以调用stream.str().length()查看),还要调用一下stream.str(""); 来释放空间,这样在多次使用时也不会有问题
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()

//stream.clear(); 和 stream.str("");
stringstream stream;
int a,b;

stream<<"80";
stream>>a;
cout<<"Size of stream = "<<stream.str().length()<<endl;

stream.clear(); //注意
// stream.str(""); //这句很关键,观察这句话在注释和不注释情况下的输出区别

cout<<"Size of stream = "<<stream.str().length()<<endl;

stream<<"90";
stream>>b;

cout<<"Size of stream = "<<stream.str().length()<<endl;

cout<<a<<endl;
cout<<b<<endl;

system("PAUSE ");

(3) 字符串分割

  • sstream可以利用空格符号进行自动分割,就像用cin输入时遇到空格会打断一样
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()

string line,substr;
cout<<"输入带空格的字符串:";
getline(cin,line);

stringstream ss(line); //用getline读取的一行数据创建一个“字符串流” SS 。
while(ss >> substr) //用空格分割子串输出
cout<<substr<<endl;

return 0;


以上是关于C++/STL1. string类的主要内容,如果未能解决你的问题,请参考以下文章

将一个char类型字符添加到string的尾部的方法---C++

将一个char类型字符添加到string的尾部的方法---C++

将一个char类型字符添加到string的尾部的方法---C++

将一个char类型字符添加到string的尾部的方法---C++

java所有变量定义时都要赋初值吗????

如何封装C语言的字符串相关功能