• C++STL常见用法


    1、string

    概念:相当于char*的封装,理解为字符串

    1.1.简单使用
    /**C中定义字符串以及打印*/
    char *ch="asdkajbf";
    for(int i=0;ch[i]!='';i++) cout<<*(ch+i);
    /**C++中*/
    string s="ssadaffw";
    cout<<s<<endl;
    1.2.获取一行字符串及长度

    用cin读入字符串的时候,是以空格为分隔符的,如果想要读入一整行的字符串,就需要用getline

    s 的长度可以用s.length() 获取(有几个字符就是长度多少,不存在char[] 里面的什么末尾的结束之类的)

    string s; // 定义一个空字符串s
    getline(cin, s); // 读取一行的字符串,包括空格
    cout << s.length(); // 输出字符串s的长度 
    1.3.+=运算符

    +=对于字符串、字符有效,数字会转为asc码

    1.4.排序(使用algorithm头文件)
    string s="5418340";
    sort(s.begin(),s.end());
    cout<<s;
    1.5.insert函数

    string &insert(int p0, const char *s);——在p0位置插入字符串s

    string &insert(int p0, const char *s, int n);——在p0位置插入字符串s的前n个字符

    string &insert(int p0,const string &s);——在p0位置插入字符串s

    string &insert(int p0,const string &s, int pos, int n);——在p0位置插入字符串s从pos开始的连续n个字符

    string &insert(int p0, int n, char c);//在p0处插入n个字符c

    iterator insert(iterator it, char c);//在it处插入字符c,返回插入后迭代器的位置

    void insert(iterator it, const_iterator first, const_iteratorlast);//在it处插入从first开始至last-1的所有字符

    void insert(iterator it, int n, char c);//在it处插入n个字符c

    string str="to be question";
    string str2="the ";
    string str3="or not to be";
    string::iterator it; str.insert(
    6,str2); // to be (the )question str.insert(6,str3,3,4); // to be (not )the question str.insert(10,"that is cool",8); // to be not (that is )the question str.insert(10,"to be "); // to be not (to be )that is the question str.insert(15,1,':'); //加一个'.' to be not to be(:) that is the question it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question str.insert (str.end(),3,'.'); // to be, not to be: that is the question(...) str.insert (it+2,str3.begin(),str3.begin()+3); // to be, (or )not to be: that is the question...
    1.6.erase函数
    /*begin是头迭代器,end是尾迭代器*/
    string s="5418340";
    s.erase(s.begin());//删除第一个
    s.erase(--s.end());//删除最后一个
    cout<<s;
    1.7.substr函数
    string s2=s.substr(4); // 表示从下标4开始一直到结束
    string s3=s.substr(5,3); // 表示从下标5开始,3个字符
    1.8.循环(3种)

    1.for循环

    string s="5418340";
    for(int i=0;i<s.length();i++) cout<<s[i];

    2.迭代器

    for(string::iterator it=s.begin();it!=s.end();it++) cout<<*it;

    3.迭代器化简

    for(auto it=s.begin();it!=s.end();it++) cout<<*it;

    4.利用C++ 11新特性for循环

    for(auto x:s) cout<<x;

    2、动态数组vector(矢量)

    概念:vector相当于数组,模板类型相当于存放的内容

    1.vector构造

    vector<int> v1;//定义一个空vector
    vector<int> v2(4);//定义一个4个大小的vector,初始为0
    vector<int> v3(4,6);//定义一个4个大小的vector,初始为6
    vector<int> v4{1,2,3,4,5};//定义一个vector,数字为1,2,3,4,5

    2.用at或者[]获取元素

    vector<int> v{1,2,3,4,5};
    cout<<v[1];//输出为2
    cout<<v.at(2);//输出为3

    3.方法

    • push_back追加内容
      vector<int> v;
      v.push_back(5);
      v.push_back(5);
      v.push_back(5);
      v.push_back(5);
      v.push_back(6);
      for(auto x:v) cout<<x<<" ";
    • resize进行重置大小

      v.resize(10);//不赋值默认为0
    • erase删除元素,复杂度为O(n)
      v.erase(v.begin());//删除第一个元素
      v.erase(--v.end());//删除最后一个元素

                                        

    •   获取第一个元素,获取最后一个元素
      /**获取第一个元素*/
      cout<<v.front();
      cout<<v[0];
      cout<<*v.begin();
      /**获取最后一个元素*/
      cout<<v.back();
      cout<<v[v.size()-1];//size是获取大小
      cout<<*--v.end(); 

    4.排序

    sort函数第三个参数为比较器,不写默认为less<int>()

    vector<int> v{5,1,2,5,4,0,-1};
    sort(v.begin(),v.end(),less<int>());//从小到大
    sort(v.begin(),v.end(),greater<int>());//从大到小排序
    for(auto x:v) cout<<x;

    5.循环

    vector<int> v{5,1,2,5,4,0,-1};
    
    for(int i=0;i<v.size();i++) cout<<v[i]<<" ";//for循环
    cout<<endl;
    
    for(vector<int>::iterator it=v.begin();it!=v.end();it++) cout<<*it<<" ";//迭代器循环 
    cout<<endl;
    
    for(auto it=v.begin();it!=v.end();it++) cout<<*it<<" ";//迭代器简化循环 
    cout<<endl;
    
    for(auto x:v) cout<<x<<" ";//c++11新特性
    cout<<endl;

    3、STL——stack

    概念:栈(先进后出)

    • 构造
      stack<int> s;
    • push、pop、size、empty
    • push 入栈一个元素
    • pop 出栈一个元素(无返回值)
    • top 访问栈顶元素
    • size 查看元素个数
      s.push(2);
      s.push(3);
      cout<<s.top()<<endl; //3
      s.pop();
      cout<<s.top()<<endl; //2
      cout<<s.size()<<endl;
    • 进制转换(十进制转二进制)

      int itob(int decimal){
          stack<int> s;int res=0;
          while(decimal!=0){
              s.push(decimal%2);
              decimal/=2;
          }
          while(!s.empty()){
              res=res*10+s.top();
              s.pop();
          }
          return res;
      }
    • 逆序单词(拓展sstream)

      输入一行字符串,将字符串逆序打印

      输入:hello world my name is yi

      输出:yi is name my world hello

      #include <iostream>
      #include <stack>
      #include <sstream>
      using namespace std;
      int main(){
          string str;
          stack<string> s;
          getline(cin,str);
          stringstream ss;
          ss<<str;//一行全部进去
          while(ss>>str)//一个一个单词输出
              s.push(str);
          while(!s.empty()){
              cout<<s.top();
              s.pop();
              if(s.size()!=0) cout<<" ";
          }
          return 0;
      }

      这里再介绍一下stringstream(字符串流)用法

    • 字符串转数字

      方法1:

       string s="1234";
       int i;
       stringstream ss;
       ss<<s;
       ss>>i;
       cout<<i;

      方法2:

      string s="1234";
      int i=stoi(s);
      cout<<i;
    • 数字转字符串

      方法1:

      int a=1234;
      string out;
      stringstream ss;
      ss<<a;
      ss>>out;
      cout<<out<<endl;

      方法2:(c++ 11)

      int a=1234;
      cout<<to_string(a)<<endl;

    4、STL——queue

    概念:队列(先进先出)

    • 构造
      queue<int> q;
    • push、back

      q.push(5);
      q.push(6);
      cout<<q.front()<<endl;//5
      q.pop();
      cout<<q.front()<<endl;//6
      cout<<q.size()<<endl;

    5、STL——map(unordered_map pair)

    概念:映射(map为树状表,unorderedmap为哈希表)

    特点:map 会自动将所有的键值对按照键从小到大排序

    • map  有序的,树状结构(底层)
      map<string, int> m; // 定义一个空的map m,键是string类型的,值是int类型的
      m["hello"] = 2; // 将key为"hello", value为2的键值对(key-value)存入map中
      cout << m["hello"] << endl; // 访问map中key为"hello"的value, 如果key不存在,则返回0
      cout << m["world"] << endl;
      m["world"] = 3; // 将"world"键对应的值修改为3
      m[","] = 1; // 设立一组键值对,键为"," 值为1
      // 用迭代器器遍历,输出map中所有的元素,键用it->first获取,值用it->second获取
      for (auto it = m.begin(); it != m.end(); it++) {
        cout << it->first << " " << it->second << endl;
      }
      //利用C++ 11新特性
      for (auto tmp:m){
         cout<<tmp.first<<" "<<tmp.second<<endl;
      }
      // 访问map的第一个元素,输出它的键和值
      cout << m.begin()->first << " " << m.begin()->second << endl;
      // 访问map的最后一个元素,输出它的键和值
      cout << m.rbegin()->first << " " << m.rbegin()->second << endl;
      // 输出map的元素个数
      cout << m.size() << endl;
    • unordered_map  //无序的,哈希结构(底层)

    用法同map

    • pair的用法(map转成vector进行排序)
      bool cmp(pair<int,int> a,pair<int,int> b){
          return a.first>b.first;
      }
      int main(){
          unordered_map<int,int> m;
          m[6]=3;
          m[5]=8;
          m[4]=9;
          vector<pair<int,int>> v(m.begin(),m.end());
          sort(v.begin(),v.end(),cmp);
          for(auto tmp:v){
              cout<<tmp.first<<" "<<tmp.second<<endl;
          }
          return 0;
      }

    9、set(unordered_set)

    概念:集合

    特点:一个set 里面的各元素是各不相同的,而且set 会按照元素进行从小到大排序

    • set  树状结构,有序
    set<int> s; // 定义一个空集合s
    s.insert(1); // 向集合s里面插入一个1
    cout << *(s.begin()) << endl; // 输出集合s的第一个元素 (前面的星号表示要对指针取值)
    for (int i = 0; i < 6; i++) {
        s.insert(i); // 向集合s里面插入i
    }
    for (auto it = s.begin(); it != s.end(); it++) { // 用迭代器遍历集合s里面的每一个元素
        cout<<*it<<" ";
    }
    for(auto tmp:s)
        cout<<tmp<<" ";
    cout << endl << (s.find(2) != s.end()) << endl;
    // s.find()用于查找集合s中的值,如果结果等于s.end()表示未找到(因为s.end()表示s的最后一个元素的下一个元素所在的位置)
    // s.find(2)!=s.end()表示能找到这个元素,因为能找到2,所以为真(1)
    cout << (s.find(10) != s.end()) << endl;//找不到10,为假(0)
    s.erase(1); // 删除集合s中的1这个元素
    cout << (s.find(1) != s.end()) << endl;
    • unordered_set  哈希结构,无序,快

    用法同set

    10、STL——deque

    集合

    概念:双端队列

    deque<int> d;
    // 4 9 1 2
    d.push_back(1);
    d.push_back(2);
    d.push_front(9);
    d.push_front(4);
    d.pop_back();
    d.pop_front();
    for(auto tmp:d) cout<<tmp<<endl;
    for(auto it=d.begin();it!=d.end();it++) cout<<*it<<endl;
    • 排序
      sort(d.begin(),d.end(),greater<int>());

    11、STL——list

    概念:双向链表

    list<int> li;
    li.push_back(6);
    li.push_front(5);
    li.emplace_front(9);
    li.emplace_back(10);
    li.insert(++li.begin(),2);
    for(auto tmp:li) cout<<tmp<<endl;
    for(auto it=li.begin();it!=li.end();it++) cout<<*it<<endl;

    参考:https://www.cnblogs.com/littlepage/p/12113748.html

  • 相关阅读:
    python基本数据类型之字符串(二)
    python基本数据类型之字符串(一)
    Java基础之Java简介
    1024lab-How to run project using .ipynb
    pytorch调试工具
    关于深度学习选择和使用GPU
    中文文本预处理
    GCN相关
    Bert project Debug记录
    图卷积相关的参考
  • 原文地址:https://www.cnblogs.com/transmigration-zhou/p/12269811.html
Copyright © 2020-2023  润新知