C++ 标准库string【学习笔记】

C++ 标准库string

基础操作

#include <string>
#include <iostream>
#include <cctype>

using namespace std;

int main()
{
    // 初始化------------------------------------------------------
    string s1 = "value_s1";
    string s2(s1);
    string s3("value_s3");
    string s4(4,'c');
    
    cout << "s1 = " << s1 << endl;  // s1 = value_s1
    cout << "s2 = " << s2 << endl;  // s2 = value_s1
    cout << "s3 = " << s3 << endl;  // s3 = value_s3
    cout << "s4 = " << s4 << endl;  // s4 = cccc

    // 操作----------------------------------------------------------
    cout << "size of s1:" << s1.size() << endl;
    cout << "s2 is empty?:" << s2.empty() << endl;
    cout << "s1 + s2 = :" << s1+s2 << endl;

    // 读取字符串:-----------------------------------------------------------------------------------------------
    // IO操作符读取:读取从非空格开始,到空格结束
    string a,b;
    cout << "input string:" << endl;
    cin >> a >> b;
    cout << "a = " << a << "b = " << b << endl;
    getline从流中读取: 读取一整行
    string c;
    while (getline(cin, c)){
        cout << "c = " << c << endl;
    }

    // 使用范围for语句遍历string:----------------------------------------------------------------------------------
    string str="ab!!cd,,efg";
    for(auto c: str){
        cout << c <<endl;
    }
    // 使用范围for语句遍历string,进行操作
    cout << "使用范围for语句遍历string:"<<endl;
    decltype(str.size()) count = 0; // decltype(str.size())返回的是str.size()的类型
    // 当不需要更改str中的值时:
    for(auto c:str){
        if(ispunct(c)) //ispunct函数是<cctype>头文件中的字符操作函数
            count++;
    }
    // 当需要更改str中的值时:使用引用
    for(auto &c:str){
        c = toupper(c);  //c是引用,因此这里会直接更改str中的值
    }
    cout <<"number of puncts:"<< count << endl;
    cout << "str = "<<str<<endl;

    // 字符串中字符的访问:-----------------------------------------------------------------------------------
    // 1. 下标访问:
    cout << "下标访问" <<endl;
    for(int i = 0; i!=str.size();i++){
        cout << str[i] <<endl;
    }
    // 2. 迭代器访问:
    cout << "迭代器访问" <<endl;
    for(auto it=str.begin(); it!=str.end(); ++it){
        cout<<*it<<endl;  // it是一个迭代器变量,*it返回所指元素的引用,及在*it上的操作也是在str中的操作
    }
    return 0;
}

进阶操作

构造、初始化string

  • string s(cp,n) 从数组中拷贝前n个字符
  • string s(s2,pos2) 从字符串s2的pos2位置开始拷贝
  • string s(s2,pos2,len2) 从字符串s2的pos2位置拷贝len2个字符
const char *cp = "hello world!!";
char p[]={'h','w'};
string s1(cp); //直接从字符串数组中拷贝,直到遇到空字符 s1="hello world!!"
string s2(p); //错误,因为p不是以空字符结束,无法拷贝
string s3(p,2); //正确,拷贝数组p的前两个字符 s3="hw"
string s4(cp+6,5);//从cp+6位置开始拷贝5个字符 s4="world"
string s5(s1,6,5);//从s1的位置6开始拷贝5个字符 s5="world"
string s6(s1,6);//从s1的位置6开始拷贝 s6="world!!"
string s7(s1,6,20);//从s1的位置6开始拷贝20个字符 s7="world!!!"
string s8(s1,16);//从s1的位置16开始拷贝,抛出out_of_range异常
  • s.substr(pos,n)从string的pos位置开始拷贝n个字符
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异常

更改string

  • string的insert()erase()可以接受迭代器,也可以接受下标;
s.insert(s.size(),5,'!');//在s.size()对应的位置(尾后)之前插入5个‘!’,也就是在s之后插入5个!
s.insert(0,s2);//在s的0位置之前插入s2的拷贝
s.insert(0,s2,0,s2.size());//在s的0位置之前插入 s2从0位置开始的s2.size()个字符
s.erase(s.size()-5,5); //删除s的后5个字符
  • 与字符串数组的转换:
const char *cp="Stately,plump Buck";
s.assign(cp,7);//使用cp的前7个字符来替换s s="Stately"
s.insert(s.size(),cp+7);//在s尾部添加从cp+7开始的字符 s="Stately,plump Buck"
  • append()replace()
string s1("abcd"),s2=s1;
s1.insert(s1.size(),"efg"); //s1="abcdefg"
s2.append("efg");  //s2="abcdefg"
s1.replace(4,3,"EFG");//s1="abcdEFG"
s2.replace(4,3,"EFGH");//s2="abcdEFGH"

搜索操作

  • s.find(args)在s中寻找args第一次出现的位置
  • s.rfind(args)在s中寻找args最后一次出现的位置
  • s.find_first_of(args)在s中寻找args中任意元素第一次出现的位置
  • s.find_first_not_of(args)在s中寻找args中任意元素第一次没出现的位置
  • s.find_last_of(args)在s中寻找args中任意元素最后一次出现的位置
  • s.find_last_not_of(args)在s中寻找args中任意元素最后一次没出现的位置
string s("Abcdefgsdf");
auto pos=s.find("Abcd");
auto pos1=s.rfind("f");
cout<<pos<<" "<<pos1<<endl;
string numbers("0123456789"),name("rbd35k4");
auto pos2=name.find_first_of(numbers);
auto pos3=name.find_last_of(numbers);
auto pos4=name.find_first_not_of(numbers);
auto pos5=name.find_last_not_of(numbers);
cout<<pos2<<" "<<pos3<<" "<<pos4<<" "<<pos5<<" "<<endl;

练习:查找string中的所有数字的位置

string temp("al46ien7g234lhbo4534ohln65oh4oh7j653dhg");
string::size_type pos=0;
while(temp.find_first_of(numbers,pos)!=string::npos){
    pos=temp.find_first_of(numbers,pos);
    cout<<"position:"<<pos<<endl;
    pos++;
}

compare函数:

  • 大于返回正数,小于返回负数,等于返回0
  • s.compare(s2)s与整个s2比较
  • s.compare(pos1,n1,s2)s从pos1开始的n1个字符与整个s2比较
  • s.compare(pos1,n1,s2,pos2,n2)s从pos1开始的n1个字符与s2从pos2开始的n2个字符比较
  • s.compare(cp)s与cp指向的字符数组比较
  • s.compare(pos1,n1,cp)s从pos1开始的n1个字符与cp指向的字符数组比较
  • s.compare(pos1,n1,cp,n2)s从pos1开始的n1个字符与cp指向的地址开始的n2个字符比较

数值转换

  • 非成员函数
  • to_string(val):将任何算数类型数值val转换成string
  • stoi(s):string转换成int整型
  • stol(s):string转换成long整型
  • stoul(s):string转换成unsigned long整型
  • stoll(s):string转换成long long整型
  • stoull(s):string转换成unsigned long long整型
  • stof(s):string转换成float浮点型
  • stod(s):string转换成double浮点型
  • stold(s):string转换成long double浮点型

练习:提取字符串中的数值

string a("pi=3.14");
double d=stod(a.substr(a.find_first_of("+-.0123456789")))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章