string用法


string类

简介

string是c++中的一级成员,纯c中没有,使用时需要用到头文件#include,下面将总结string的常用方法。

string的定义及初始化

string str;//生成空字符串
string s(str);//生成字符串为str的复制品
string s(str,str_begin,str_len);//将字符串str中从下标str_begin开始、长度为str_len的部分作为字符串初值
string s(str,c_len);//以str的前c_len个字符串作为字符串s的初值
string s(num,c);//生成num个c字符的字符串
string s(str,str_idx);//将字符串str中从下标str_idx开始到字符串结束的位置作为字符串初值

EG:

string s0;//生成空字符串
string s1="hello";//初始化一
string s1("world");//初始化二
string s2(s1,2,3);//s2="llo";从s1的2位置的字符开始,连续3个字符赋值给s5
string s3(s1,1);//s3="ello";从s1的2位置的字符开始,将后续的字符都赋值给s6
string s4(5,'a');//s4="aaaaa";

string的读入

string 类支持 cin 方式和 getline() 方式两种输入方式。简单示例如下:

string s;
cin>>s;//不能读空格,遇到空白字符即停止读入
getline(cin,s);//可以读空格,读取一整行的内容

string的大小和容量

s.size()和s.length()返回string对象的字符个数。

s.max_size()返回string对象最多包含的字符数。

string的比较

1、支持 ==、>=、<=、!=、>、<等比较运算符

2、s.compare();

string a("aa");
string b("bb");
string c("bb");
a.compare(b)-> -1
b.compare(a)->  1
b.compare(c)->  0

string的插入

1、push_back();

2、insert();

string s;
//尾插一个字符
s.push_back('a');
s.push_back('b');
s.push_back('c');
//s: abc
//insert(pos,char);在指定的位置pos前插入字符char
string s1 = "hello";
s1.insert(1,"ins"); //从s1的1位置开始,插入"ins"字符串,即s1="hinsello";
s1.insert(1, "ins", 2);//从s1的1位置开始,插入"ins"字符串的前2个字符,即s1="hinello";
s1.insert(1, "ins", 1, 2);//从s1的1位置开始,插入"ins"字符串的从1位置开始的2个字符,即s1="hnsello";

string拼接字符串

1、append();

2、’+’’;

string s("abc");
s.append("def");
//s: abcdef
string s1="abc";
string s2="def";
s1=s1+s2;//'='右边至少有一个string类型的对象
//s1: abcdef

string的遍历

1、借助迭代器

2、下标法

string s("abcdef");
//下标法
/*
s[0]:'a'
s[1]:'b'
s[2]:'c'
s[3]:'d'
s[4]:'e'
s[5]:'f'
*/
//正向迭代器
string::iterator iter=s.begin();
for(;iter<s.end();iter++)
{
    cout<<*iter;
}
cout<<endl;
//反向迭代器
string::reverse_iterator riter=s.rbegin();
for(;riter<s.rend();riter++)
{
    cout<<*riter;
}
cout<<endl;

string的删除

1. iterator erase(iterator p);//删除字符串中p所指的字符
2. iterator erase(iterator first, iterator last);//删除字符串中迭代器区间[first,last)上所有字符
3. string& erase(size_t pos=0, size_t len=npos);//删除字符串中从索引位置pos开始的len个字符
4. void clear();//删除字符串中所有字符


string s1 = "123456789";
s1.erase(s1.begin()+1);              // 结果:13456789
s1.erase(s1.begin()+1,s1.end()-2);   // 结果:189
s1.erase(1,6);                       // 结果:189
string::iterator iter = s1.begin();
while(iter!=s1.end())
{
	cout<<*iter;
	*iter++;
}
cout<<endl;

string的字符替换

1. string& replace(size_t pos, size_t n, const char *s);//将当前字符串从pos索引开始的n个字符,替换成字符串s
2. string& replace(size_t pos, size_t n, size_t n1, char c); //将当前字符串从pos索引开始的n个字符,替换成n1个字符c
3. string& replace(iterator i1, iterator i2, const char* s);//将当前字符串[i1,i2)区间中的字符串替换为字符串s

string s1("hello,world!");
cout<<s1.size()<<endl;                     // 结果:12
s1.replace(s1.size()-1,1,1,'.');           // 结果:hello,world.
// 这里的6表示下标  5表示长度
s1.replace(6,5,"girl");                    // 结果:hello,girl.
// s1.begin(),s1.begin()+5 是左闭右开区间
 s1.replace(s1.begin(),s1.begin()+5,"boy"); // 结果:boy,girl.
 cout<<s1<<endl;

string的查找

1. size_t find (constchar* s, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找子串s,返回找到的位置索引,-1表示查找不到子串

2. size_t find (charc, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找字符c,返回找到的位置索引,-1表示查找不到字符

3. size_t rfind (constchar* s, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,-1表示查找不到子串

4. size_t rfind (charc, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符

5. size_tfind_first_of (const char* s, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找子串s的字符,返回找到的位置索引,-1表示查找不到字符

6. size_tfind_first_not_of (const char* s, size_t pos = 0) const;
//在当前字符串的pos索引位置开始,查找第一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到字符

7. size_t find_last_of(const char* s, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,查找最后一个位于子串s的字符,返回找到的位置索引,-1表示查找不到字符

8. size_tfind_last_not_of (const char* s, size_t pos = npos) const;
//在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到子串

string s("dog bird chicken bird cat");
//字符串查找-----找到后返回首字母在字符串中的下标

// 1. 查找一个字符串
cout << s.find("chicken") << endl;// 结果是:9

// 2. 从下标为6开始找字符'i',返回找到的第一个i的下标
cout << s.find('i',6) << endl;// 结果是:11

// 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标
cout << s.rfind("chicken") << endl;// 结果是:9

// 4. 从字符串的末尾开始查找字符
cout << s.rfind('i') << endl;// 结果是:18-------因为是从末尾开始查找,所以返回第一次找到的字符

// 5. 在该字符串中查找第一个属于字符串s的字符
cout << s.find_first_of("13br98") << endl;// 结果是:4---b

// 6. 在该字符串中查找第一个不属于字符串s的字符------先匹配dog,然后bird匹配不到,所以打印4
cout << s.find_first_not_of("hello dog 2006") << endl;// 结果是:4
cout << s.find_first_not_of("dog bird 2006") << endl;// 结果是:9

// 7. 在该字符串最后中查找第一个属于字符串s的字符
cout << s.find_last_of("13r98") << endl;// 结果是:19

// 8. 在该字符串最后中查找第一个不属于字符串s的字符------先匹配t--a---c,然后空格匹配不到,所以打印21
cout << s.find_last_not_of("teac") << endl;// 结果是:21

string的排序

sort(s.begin(),s.end())

string s("acdebf");
sort(s.begin(),s.end());
cout<<s<<endl;//s:"abcdef"

刷题遇到的

  1. std::reverse(),顾名思义,用于反转序列。需要提供首尾迭代器作为参数。
  2. std::string::erase(),传入两个迭代器 l,r,清除[l,r)范围内的字符。
  3. std::string::substr(),用于提取子字符串,用法与前者类似。
  4. std::string::find(),用来查找字串在母串中第一次出现的位置。

参考资料

String用法详解

C++中string常用函数用法总结

cppreference.com


文章作者: Amonologue
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Amonologue !
  目录