Fork me on GitHub

C++STL常见用法

1、string

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

1.1.简单使用
/**C中定义字符串以及打印*/
char *ch="asdkajbf";
for(int i=0;ch[i]!='\0';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

 

posted @ 2020-02-06 18:43  熠丶  阅读(360)  评论(0编辑  收藏  举报