昨天刷了牛客网几道关于字符串的题目,感觉不如别人写的简洁、运行效率高。所以,就系统地学习并且整理了一些关于 string 的用法,方便编写代码。在介绍之前,需要了解一下迭代器,因为用得着(这一部分不再赘述,可参考 C++ Primer 第五版 P95)。
先看一个例子,大致了解迭代器。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin,s);
for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it)
*it = toupper(*it);
cout << s << endl;
return 0;
}
该程序是将string对象中的第一个单词,变成大写,比如如果输入的是 hello world,那么输出的就是 HELLO world。begin 指向容器的第一个元素或者第一个字符,end 指向容器的尾元素的下一个位置,又称尾后迭代器。获取迭代器指向的元素,也是通过解引用获得,比如上面代码中的 *it,当然了,不能试图解引用一个非法迭代器或者尾后迭代器。如果有必要,要加上一条判断语句:
if (s.begin() != s.end())
{
}
1、删除字符串中的某个元素(使用string的成员函数 erase)
用法如下:iterator erase( iterator pos );//删除pos指向的字符, 返回指向下一个字符的迭代器
举个例子:(严格来讲,需要判断迭代器有效,即在处理之前,应该先判断 s.begin() != s.end;)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin,s);
auto it = s.begin();
s.erase(it+1);
cout << s << endl;
return 0;
}
说明:erase () 函数的形参是迭代器,类似于指针
2、插入:在字符串某个(某段)位置中的字符(字符串)(使用string的成员函数 insert())
用法如下:1) iterator insert( iterator i,const char &c );//在迭代器i表示的位置前面插入一个字符c
2) basic_string &insert(size_type index, const basic_string &str );//在字符串的位置index插入字符串str
3) basic_string &insert(size_type index, const char *str );//在字符串的位置index插入字符串str
4) basic_string &insert(size_type index1, const basic_string &str, size_type index2, size_type num);//在字符串的位置index1处插入字符串str的子串字串从index2开始,长num
5) basic_string &insert(size_type index, const char *str, size_type num );//在字符串的位置index插入字符串str的前num个字符
6) basic_string &insert(size_type index, size_type num, char c );//在字符串的位置index插入num个字符c
7) void insert( iterator i,size_type num, const char &ch );//在迭代器i表示的位置前面插入num个字符ch
8) void insert( iterator i,iterator start, iterator end );//在迭代器i表示的位置前面插入一段字符,从start开始,以end结束
以第2个和第8个为例。#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin,s);
auto it = s.begin();
s.insert(2,"hello");//输入为hello ,输出为 hehellollo
cout << s << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin,s);
auto it = s.begin();
s.insert(it+2,it+3,it+6);// 在第三个字符(d)前面,插入从第4个字符(f)到第6个字符(h)
cout << s << endl;
return 0;
}
输出结果:
3、替换字符串中的某个元素(使用string的成员函数 replace())
1) basic_string &replace(size_type index, size_type num, const basic_string &str );//删除从index开始的num个字符,并在index处插入str
e.g. stringstr_1 = “abc”;
str_1.replace(2,3,”qqq”);//str= abqqq
2) string &replace(int index,int num,const char *s, int n);//删除index开始的num个字符,然后在index处插入字符串s的前n个字符
3) string &replace(int p0, intn0,const string &s);//删除从p0开始的n0个字符,然后在p0处插入串s
4) string &replace(int p0, intn0,const string &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符
5) string &replace(int p0, intn0,int n, char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c
6) string &replace(iteratorfirst0, iterator last0,const char *s);//把[first0,last0)之间的部分替换为字符串s
7) string &replace(iteratorfirst0, iterator last0,const char *s, int n);//把[first0,last0)之间的部分替换为s的前n个字符
8) string &replace(iteratorfirst0, iterator last0,const string &s);//把[first0,last0)之间的部分替换为串s
9) string &replace(iteratorfirst0, iterator last0,int n, char c);//把[first0,last0)之间的部分替换为n个字符c
10) string &replace(iteratorfirst0, iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之间的部分替换成[first,last)之间的字符串
4、查找字符串中的某个元素(使用string的成员函数 find())
1) 从前往后查找(find)—成功返回位置,失败返回string::npos
a) int find(char c, int pos = 0)const;//从pos开始查找字符c在当前字符串的位置
b) int find(const char *s, int pos= 0) const;//从pos开始查找字符串s在当前串中的位置
c) int find(const char *s, intpos, int n) const;//从pos开始查找字符串s中前n个字符在当前串中的位置
d) int find(const string &s,int pos = 0) const;//从pos开始查找字符串s在当前串中的位置
2) 从后往前查找(rfind)—成功返回位置,失败返回string::npos
a) int rfind(char c, int pos =npos) const;//从pos开始从后向前查找字符c在当前串中的位置
b) int rfind(const char *s, intpos = npos) const;
c) int rfind(const char *s, intpos, int n = npos) const; //从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,
d) int rfind(const string&s,int pos = npos) const;
3) 从前往后查找第一次出现的位置(find_first_of) (find_last_of) —成功返回位置,失败返回string::npos
a) int find_first_of(char c, intpos = 0) const;//从pos开始查找字符c第一次出现的位置
b) int find_first_of(const char*s, int pos = 0) const;
c) int find_first_of(const char*s, int pos, int n) const;
d) int find_first_of(const string&s,int pos = 0) const;
4) 从前往后查找第一个不在的位置(find_first_not_of) (find_last_not_of)—成功返回位置,失败返回string::npos
a) int find_first_not_of(char c,int pos = 0) const;//查找第一个不是c的字符出现的位置
b) int find_first_not_of(constchar *s, int pos = 0) const;
c) int find_first_not_of(constchar *s, int pos,int n) const;
d) int find_first_not_of(conststring &s,int pos = 0) const;//查找第一个不在s中的字符出现的位置