C++ 的 STL 常用标准模板库

  以下内容只是记录C++中常用标准库的大致用法,更多方法或者具体参数请参考C++的API文档,具体运用还需根据实际情况书写代码

  • 头文件
    • 类似于第三方包,或者说是系统的包
    • # include<bits/stdc++.h> ,包含所有头文件
// 向量容器 
# include<vector>
// 字符串类型
# include<string> 
// 算法库
# include<algorithm> 
//
# include<stack>
// 队列
# include<queue>
// 集合
# include<set> 
// 映射
# include<map> 
// 链表
# include<list>

 

  • 向量 vector 
    • 类似与数组或者链表,存储空间 “无限”
// vector
void vec_function() {
    // vector<int> acc(100) 生成指定容量的容器 
    vector<int> vec;
    for(int i=1; i<=20; i++) {
        // 添加数据方式 
        vec.push_back(21-i);
    }
    // 插入字符串,insert(位置下标,字符串)    
    vec.insert(vec.begin(), 0);            
    
    // 通过迭代器遍历,包括vector,queue,stack等同理 
    // 迭代器跟指针的作用类似 
    vector<int>::iterator ite_vec;
    for(ite_vec=vec.begin(); ite_vec!=vec.end(); ite_vec++) {
        cout<< *ite_vec<< " ";
    }

    // vector 也可以使用类似数组一样遍历 
    int length = vec.size();
    for(int i=0; i<length; i++) {
        cout<< vec[i]<< " ";
    }
    // 清空容器内容 
    vec.clear();    
    
} 
vector

 

  • 字符串 string
    • 字符串类型,便于字符串操作
// string
void str_function() {
    string str = "abc";
    // 末尾添加一个字符 
    str.push_back('2');
    // 末尾拼接一个字符串  str += "345" 同效果,但这种是生成了新的变量 
    str.append("345");
    // 在指定位置插入数据 
    str.insert(3, "1");
    cout<< str;
    
}
string

 

  • 算法库 algorithm
    • 提供常用的算法支持,这里值用了sort、nth_element
// sort、nth_element 
void algorithm_function() {
    int arr[] = {3, 1, 5, 2, 4, 10, 7, 9, 8, 6};
    // 快速排序,平均时间复杂读 O(n*logn) 
    // sort([a, b), Compare_function)
    sort(arr+0, arr+10, com);
    for(int i=0; i<10; i++) {
        cout<< arr[i]<< " ";
    }
    
    // 模拟快速排序,平均时间复杂度 O(n)
    // 即得出下标为 n 位置的元素有序,其余不一定 
    // nth_element(X.begin(), X.begin()+n, X.end())
    nth_element(arr, arr+3, arr+10);
    for(int i=0; i<10; i++) {
        cout<< arr[i]<< " ";
    }
    
} 

algorithm
algorithm

 

  • 栈 stack
    • 先进后出
// stack
void st_function() {
    stack<int> st;
    // 进栈,从末尾进 
    st.push(5);
    // 取栈顶元素
    int ele = st.top(); 
    cout<< ele;
    // 退栈,从末尾退 
    st.pop();
    // 栈是否为空 
    st.empty();
    // 栈内元素数量 
    st.size();
    
}
stack

 

  • 队列 queue
    • 如同排队,先进先出
// queue 
void que_function() {
    queue<int> que;
    // 进队列,从队尾进 
    for(int i=0; i<5; i++) {
        que.push(i);
    }
    // 取队列队首元素 
    int ele = que.front();
    cout<< ele;
    // 出队列,从队首出 
    que.pop();
    // 队列是否为空 
    que.empty();
    // 队内元素数量 
    que.size();
    
} 
queue

 

  • 优先队列 priority_queue
    • 自动排好序的队列
// priority_queue
void pri_que_function() {
    // greater 升序(默认), less 降序 
    priority_queue<int, vector<int>, less<int> > pri_que;
          
    int num[10] = {5, 2, 3, 7, 9, 4, 10, 6, 1, 8};
    for(int i=0; i<10; i++)   
        pri_que.push(num[i]);  

    while(!pri_que.empty()){  
        cout<< pri_que.top()<< " ";  
        pri_que.pop();  
    }  
    
} 
priority_queue

 

  • 二元组 pair
    • 二元数据对
// pair
void pair_function() {
    // pair 初始赋值
    pair<int, string> p1, p2(1, "Tom");            
    // 通过 make_pair 赋值 
    p1 = make_pair(1, "Jerry");    
                        
    // 直接对比需要两个分量都相等才能相等 
    cout<< bool(p2==p1)<< endl; 
    
    // pair 先比较第一个元素,再比较第二个元素
    cout<< bool(p2 > p1)<< endl;    
                
    // 二元组是数据结构,也可抽象出数组 
    pair<string, int> p[10];
    for(int i=0; i<9; i++) {
        // 可以分别赋值 
        p[i].second = i+175;
        p[i].first = "Tom";
    }
    // 也可以使用 make_pair() 赋值 
    p[9] = make_pair("Tom", 185); 
    for(int i=0; i<10; i++) {
        cout<< p[i].first<< " "<< p[i].second<< endl;
    }
    
}
pair

 

  • 映射 map
    • 映射关系
// map
void map_function() {
    // 创建 map 映射 
    map<string, int> m;
    
    // 创建索引并添加 
    m["tom"] = 185;
    m["silly"] = 175;
     
    // map 可以使用 insert 添加 pair 
    pair<string, int> p("Jerry", 180);
    m.insert(p);
    
    // 清除索引为 Jerry 的元素 
    m.erase("Jerry");    
    
    map<string, int>::iterator it;
    
    // 读取内容 
    for(it = m.begin(); it != m.end(); it++) {
        // it:指针
        // 取出map的第一项和第二项,也就是key-value 
        cout<< it->first<< " "<< it->second<< endl;
    } 
    
}
map

 

  • 集合 set
// set
void set_function() {
    set<int> s;
    
    // 插入元素 
    int num[] = {1, 3, 2, 3, 2};
    for(int i=0; i<5; i++) {
        s.insert(num[i]);
    }
    
    // 删除指定内容元素 
    s.erase(2);
    
    // 要用迭代器读取, 默认是从小到大 
    set<int>::iterator ss;                    
    for(ss = s.begin(); ss != s.end(); ss++)
        cout<< *ss<< ' ';
    cout<< endl;
    
    // 集合查找元素 
    ss = s.find(6);    
    // 找到元素                        
    if(ss != s.end()) {                        
        cout<< *ss<< endl;
    //若指针已经到末尾了,则说明找不到该元素
    }else {                                     
        cout<< "Not find!\n"; 
    } 
         
}
set

 

  • 堆 heap
// make_heap(n.begin(), n.end(), com);
// 可使用com比较函数如sort一样,默认大根堆 
//
void heap_function() {
    // 使用vector向量 
    vector<int> n;
    // 0 1 2 3 4
    for(int i = 0; i <= 4; i++) {
        n.push_back(i);
    }
    
    // 注 push_heap是在堆已经建立的基础上添加元素
    // 而 make_heap是先把元素添加到数组,再用数组重新建堆 
 
     // 通过数组建堆 
    make_heap(n.begin(), n.end());
    // 打印数组元素
    // 4 3 2 0 1 
    show(n);
    
    // 排序,会打乱堆结构 
//    sort_heap(n.begin(), n.end());
//    show();

    n.push_back(5);
    // 添加堆元素
    push_heap(n.begin(), n.end());
    // 5 3 4 0 1 2
    show(n);
    
    // 堆顶元素弹出,如大根堆弹出最大值 
    pop_heap(n.begin(), n.end());
    // 4 3 2 0 1
    show(n);
}
heap

 

  • 链表list
// 双向链表 list 
void list_function() {
    list<int> l;
    for(int i = 1; i <= 5; i++) {
        l.push_back(i);
    }
    
    // 链表表头插入元素 
    l.push_front(99);
    
    // 链表表头删元素 
    l.pop_front();
    
    // 链表表尾删元素 
    l.pop_back();
    
    // 删除链表的指定项 
    l.remove(4); 
    
    // 迭代器 
    list<int>::iterator it;
    
    // 读取链表元素 
    for(it = l.begin(); it != l.end(); it++) {
        cout<< *it<< " ";
    }
    
    // 清空链表元素 
    l.clear();    
}
View Code

 

posted @ 2021-01-02 14:50  a最简单  阅读(414)  评论(0编辑  收藏  举报