c++常见问题总结_string

string

除了我们在C++常见问题总结_顺序容器中介绍的顺序容器的共同操作之外,string类型还提供了一些额外的操作。这些操作中大部分要么是提供string类和C风格字符串之间的相互转换,要么增加了允许我们使用下标替代迭代器的版本。

构造string的其他方法

string s(cp,n);//s是cp指向的数组中前n个字符的拷贝。此数组至少包含n个字符。

string s(s2,pos2); //s是string s2从下标pos2开始的字符的拷贝。

string s(s2,pos2,len2); //s是 string s2从下标pos2开始len2个字符的拷贝。至多拷贝s2.size()-pos2个字符。

上述的构造函数接受一个string或者const char *参数,还接受(可选的)指定拷贝多少个字符的参数。当传递的是一个string时,还可以给出一个下标来指出从哪里开始拷贝。
当我们从一个const char*来创建string时,若没有指定拷贝多少个字符,指针指向的数组必须以空字符结尾。

const char*cp="hello world!";
char noNULL[]={'H','i'};
string s1(cp); //正确 直到遇到空字符,s1="hello world!"
string s2(noNULL); //错误 noNULL中没有空字符
string s3(noNULL,2);//正确 s2="Hi"

//s4=s5="world"  s6=s7="world!"
string s4(cp+6,5);
string s5(s1,6,5);
string s6(s1,6);
string s7(s1,6,20);

string s8(s1,16);// 抛出一个out_of_range异常
  • substr
s.substr(pos,n); //返回一个string,包含s中从pos开始的n个字符拷贝。
s.substr(pos);

string s("hello world");
string s2=s.substr(0,5);  //s2=hello
string s3=s.substr(6);   //s3=world
string s4=s.substr(6,11); // s4=world
string s5=s.substr(12);//抛出一个out_of_range异常

//使用vector<char> 初始化一个string
string s(vc.data(),vc.size());
//data成员函数返回内存空间首地址

改变string的其他方法
string类型支持顺序容器的赋值运算符以及assign、insert和erase操作(C++常见问题总结_顺序容器)。除此之外他还定义了额外的insert和erase版本

s.insert(pos,args); //pos之前插入args指定字符 pos为下标时,返回一个指向s的引用。
s.erase(pos,len);// 删除从位置pos开始的len个字符 ,如果len被省略,则删除从pos开始直至s末尾的所有字符。返回一个指向s的引用。
s.assign(args);//s中的字符替换成args指定的字符,返回一个指向s的引用。

对于上述中insert的args参数,依赖于pos是如何指定的。
1、pos为迭代器参数时,insert(返回值指向第一个插入位置的迭代器)的args参数可以是:

s.insert(iter,n,c); //n个字符c
s.insert(iter,b,e); //迭代器b和e指定范围内的字符
s.insert(iter,il); //花括号字符列表

2、pos为下标参数时,insert(返回一个指向s的引用)的args参数可以是:

s.insert(pos,str);//字符串
s.insert(pos,str,pos,len);//字符串str中从pos开始最多len个字
s.insert(pos,n,c);//n个字符c
s.insert(pos,cp,len);// cp指向的字符数组前最多len个字符。
s.insert(pos,cp);//cp指向以空字符结束的字符数组

对于assign函数中的args参数可以是上述中的args中的任何一个。

example:

s.insert(s.size(),5,'!'); // 末尾插入5个感叹号
s.erase(s.size()-5,5);

const char*cp="stately, plump bulk";
s.assign(cp,7);   //s="stately"
s.insert(s.size(),cp+7);  // s="stately, plump bulk"

string s="some string",s2="some other string";
s.insert(0,s2); //位置0之前插入s2
s.insert(s,s2,0,s2.size());
  • append和replace函数
    string类定义了两个额外的成员函数:append和replace函数。
s.append(args);// 将args追加到s返回一个指向s的引用。
s.replace(range,args); //删除s中范围range内的字符,替换成args指定的字符。返回一个指向s的引用。

对于append函数中的args参数,可以是上述中的任何一种形式。

对于replace函数中的args参数,依赖于range是如何指定的。

1、当range为下标和长度时,args可以是:

s.replace(pos,len,str);
s.replace(pos,len,str,pos1,len1);
s.replace(pos,len,cp,len);
s.replace(pos,len,cp);
s.replace(pos,len,n,c);

2、当range为一对迭代器指定时,args可以是:

s.replace(b,e,str);
s.replace(b,e,cp,len);
s.replace(b,e,cp);
s.replace(b,e,n,c);
s.replace(b,e,b2,e2);
s.replace(b,e,il);

example:

string s("c++ primer"),s2=s;
s.insert(s.size()," 4th Ed. "); //s="c++ primer 4th Ed."
s2.append("4th Ed"); //等价方法

s.erase(11,3);//s=="c++ primer Ed."
s.insert(11,"5th");//s=="c++ primer 5th Ed."
s2.replace(11,3,"5th"); //等价上面两步
s2.replace(11,3,"Fifth");

string搜索操作
string类提供了一系列的搜索函数,每个搜索操作都返回一个string::size_type值表示匹配发生位置的下标。如果搜索失败,则返回一个名为string::npos的static成员。

//string搜索操作
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,p   //从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无默认值

example:

string name("AnnaBelle");
auto pos1=name.find("Anna");//pos1=0;

string numbers("0123456789"), name("r2d2");
auto pos=name.find_first_of(numbers); //任何一个字符第一次出现的位置 pos=1

string dept("03714p3");
auto pos=dept.find_first_not_of(numbers);//第一个不在其中的字符的位置 pos=5。
  • 一种常见的方法,指定从哪里开始搜索
string::size_type pos=0;

while((pos=name.find_first_of(numbers,pos))!=string::nops)
{
    ....
    ++pos;//一定要 递增 不然循环将永远不会终止。
}
  • 逆向搜索
string river("Mississippi");
auto first_pos=river.find("is");  //返回1
auto last_pos=river.rfind("is"); //返回4

compare函数
除了在C++常见问题总结_顺序容器中介绍的关系运算符之外,string还提供了compare函数(与strcmp类似)

s.compare(args); //等于、大于还是小于 返回0、正数、负数
//args参数可以的形式
s2 //比较s和s2 
pos1,n1,s2 // s中pos1开始的n个字符和s2比较
pos1,n1,s2,pos2,n2 

cp // cp指向的以空字符结尾的字符数组
pos1,n1,cp //cp指向的以空字符结尾的字符数组
pos1,n1,cp,n2  //cp指向的地址开始的n2个字符。

数值转换
1、转换为字符串

to_string(val)// val任何算数类型
//示例:
    int i = 12; 
    cout << std::to_string(i) << endl; 

//示例2:
    ostringstream os; //构造一个输出字符串流,流内容为空 
    int i = 12; 
    os << i; //向输出字符串流中输出int整数i的内容 
    cout << os.str() << endl; //利用字符串流的str函数获取流中的内容

2、转换为数值

stoi(s,p,b);
// 返回s的其实子串的数值 b为转换的基数默认为10 p 为size_t指针保存保存s中第一个非数值字符的下标 stol() stoul()  stoll() stoull() 类似只是转换成的整数类型不同
stof(s,p);
stod(s,p);
stold(s,p);

//示例:
    string s = "12"; 
    int a = atoi(s.c_str());  //string -> char* ->int

    istringstream is("12"); //构造输入字符串流,流的内容初始化为“12”的字符串 
    int i; 
    is >> i; //从is流中读入一个int整数存入i中

猜你喜欢

转载自blog.csdn.net/xc13212777631/article/details/80481589