STL string 字符串

2018-10-20 22:25:49


前言

最近几天对于字符串的处理变得多了起来,原来我是拒绝STL的,感觉string这种东西好麻烦,不如char字符数组来的简单,后来做了P1039 侦探推理这题以后发现string实在是太好用了,而今天又A了P1098 字符串的展开,再加上今天的模拟赛,对stl的string越用越舒服,因此决定写篇文章总结下备忘。

各种方法

  1. 输入

    • cin
      珂以使用cin.tie(0);来加快输入速度。
      也珂以使用ios::sync_with_stdio(false)来加快速度,但是这样就不能使用scanf输入和printf输出,会炸......
    • getline
      string s;
      getline(cin,s);

      Tips:getline(sin,s,'#')珂以读入一行,但是只保留#前面的部分到s中。

    • 转为传统字符串
      可以使用 s.c_str() 函数转为传统字符串后使用scanf("%s",s.c_str());输入,但是注意必须提前 resize 好大小,不然会爆炸!
  2. 获取长度
    int len=s.length();int len=s.size();

  3. 截取substr

    s.substr(pos, n);//截取s中从pos开始(包括0)的n个字符的子串,并返回  
    s.substr(pos);   //截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回
  4. 替换replace

    s.replace(pos, n, s1);//用s1替换s中从pos开始(包括0)的n个字符的子串
  5. 翻转reverse

    reverse(s.begin(),s.end()); // 翻转字符串
  6. 查找find

    • find(char ch/string s)
      查找字符ch或者字符串s的第一次出现的起始位置,查找不到返回 string::npos 也就是-1
    • find(string s,int pos,int n)
      从pos+1开始查找字符串s的前n个字符,返回起始位置,若不存在,则返回-1。其中n珂以省略。
      例如:
      #include<bits/stdc++.h>
      using std::cout;
      using std::endl;
      int main()
      {
      std::string s="abcabc";
      int pos=s.find('c');
      cout<<pos<<endl;
      pos=s.find("bc");
      cout<<pos<<endl;
      pos=s.find("bcf",pos+1,2);
      cout<<pos<<endl;
      pos=s.find("bcf",pos+1);
      cout<<pos<<endl;
      }

      输出为:

      2
      1
      4
      -1
  7. 插入insert

    • insert(int pos,string s)
      在pos位置的后面插入字符串s。 比如
      #include<bits/stdc++.h>
      using std::cout;
      using std::endl;
      int main()
      {
      std::string s="abc",v="dd";
      s.insert(2,v);
      cout<<s<<endl;
      }

      的输出结果是abccd

    • insert(int pos,string s,int pos2,int n)
      在pos位置的后面插入字符串s中从pos2开始的n个字符。 比如
      #include<bits/stdc++.h>
      using std::cout;
      using std::endl;
      int main()
      {
      std::string s="abc",v="def";
      s.insert(2,v,0,2);
      cout<<s<<endl;
      }

      的输出结果是abdec

    • insert(int pos,int n,char c)
      在pos位置的后面插入n个字符c
      比如
      #include<bits/stdc++.h>
      using std::cout;
      using std::endl;
      int main()
      {
      std::string s="abc";
      char c='d';
      s.insert(2,2,c);
      cout<<s<<endl;
      }

      的运行结果也是abddc

    • insert(int pos,char* s,int n)
      在pos位置插入字符数组s中的前n个字符。
      其中n珂以省略。
      例如:
      #include<bits/stdc++.h>
      using std::cout;
      using std::endl;
      int main()
      {
      std::string s="abc",v="def";
      char ss[]="ghi";
      s.insert(2,ss,2);
      cout<<s<<endl;
      char sss[]="jkl";
      s.insert(5,sss);
      cout<<s<<endl;
      }

      的输出结果就是:

      abghc
      abghcjkl
    • insert(std::string::iterator iter,int n,char ch)
      在迭代器处插入n个字符ch(将原来在迭代器处的字符向后挤),其中n珂以省略。
      例如:
      #include<bits/stdc++.h>
      using std::cout;
      using std::endl;
      int main()
      {
      std::string s="abc";
      std::string::iterator iter = s.begin();
      cout<<*iter<<endl;
      s.insert(iter,2,'f');
      cout<<s<<endl;
      iter = s.begin();
      cout<<*iter<<endl;
      s.insert(iter,'g');
      cout<<s<<endl;
      }

      输出结果:

      a
      ffabc
      a
      f
      gffabc

      珂以看出貌似迭代器还是会指向a,此时如果不对迭代器进行重新复制的话就会卡死,不知道什么原因...需要重新对iter进行赋值才能进行插入操作,玄学...

  8. 删除erase

    • erase(int pos)
      删除pos位置以及pos位置之后的所有字符。
    • erase(int pos,int n)
      删除从pos开始的n个字符。
    • erase(std::string::iterator iter)
      删除iter迭代器处的元素。
    • erase(std::string::iterator iter,std::string::iterator iter2)
      删除从iter开始到iter2结束的字符。
      例如:
      #include<bits/stdc++.h>
      using std::cout;
      using std::endl;
      int main()
      {
      std::string s="abcabc";
      s.erase(2,1);
      cout<<s<<endl;
      s.erase(1,2);
      cout<<s<<endl;
      s="abcdef";
      std::string::iterator iter = s.begin(),iter2=s.end()-2;
      s.erase(iter);
      cout<<s<<endl;
      iter=s.begin()+1;
      s.erase(iter,iter2);
      cout<<s<<endl;
      }

      的输出结果为:

      ababc
      abc
      bcdef
      bf
  9. resize

    string s;
    s.resize(100); // 相当于 new char[100];

    万岁!终于写完了orz...