C++筆記:C++標準庫中各種數據結構的用法(棧、向量、字典、集合)

1、棧的用法:

#include<stack>

stack<int> s;
s.push(item);		//將item壓入棧頂
s.pop();			//刪除棧頂的元素,但不會返回
s.top();			//返回棧頂的元素,但不會刪除
s.size();			//返回棧中元素的個數
s.empty();			//檢查棧是否爲空,如果爲空返回true,否則返回false 

2、vector的用法

#include<vector>

vector<int> vec;        //聲明一個int型向量
vector<int> vec(5);     //聲明一個初始大小爲5的int向量
vector<int> vec(10, 1); //聲明一個初始大小爲10且值都是1的向量
vector<int> vec(tmp);   //聲明並用tmp向量初始化vec向量
vector<int> tmp(vec.begin(), vec.begin() + 3);  //用向量vec的第0個到第2個值初始化tmp
int arr[5] = {1, 2, 3, 4, 5};   
vector<int> vec(arr, arr + 5);      //將arr數組的元素用於初始化vec向量
//說明:當然不包括arr[4]元素,末尾指針都是指結束元素的下一個元素,
//這個主要是爲了和vec.end()指針統一。
vector<int> vec(&arr[1], &arr[4]); //將arr[1]~arr[4]範圍內的元素作爲vec的初始值


向量大小: vec.size();
向量最大容量: vec.max_size();
更改向量大小: vec.resize();
向量真實大小: vec.capacity();
向量判空: vec.empty();
減少向量大小到滿足元素所佔存儲空間的大小: vec.shrink_to_fit(); //shrink_to_fit


多個元素賦值: vec.assign(); //類似於初始化時用數組進行賦值
末尾添加元素: vec.push_back();
末尾刪除元素: vec.pop_back();
任意位置插入元素: vec.insert();//例如vec.insert(vec.begin(),1);
任意位置刪除元素: vec.erase();
交換兩個向量的元素: vec.swap();
清空向量元素: vec.clear();


開始指針:vec.begin();
末尾指針:vec.end(); //指向最後一個元素的下一個位置
指向常量的開始指針: vec.cbegin(); //意思就是不能通過這個指針來修改所指的內容,但還是可以通過其他方式修改的,而且指針也是可以移動的。
指向常量的末尾指針: vec.cend();


下標訪問: vec[1]; //並不會檢查是否越界
at方法訪問: vec.at(1); //以上兩者的區別就是at會檢查是否越界,是則拋出out of range異常
訪問第一個元素: vec.front();
訪問最後一個元素: vec.back();
返回一個指針: int* p = vec.data(); //可行的原因在於vector在內存中就是一個連續存儲的數組,所以可以返回一個指針指向這個數組。這是是C++11的特性.

3、字典的用法

class Solution {
public:
    bool isValid(string s) {
        unordered_map<char,int> m{{'(',1},{'[',2},{'{',3},
                                {')',4},{']',5},{'}',6}};
        stack<char> st;
        bool istrue=true;
        for(char c:s){
            int flag=m[c];
            if(flag>=1&&flag<=3) st.push(c);
            else if(!st.empty()&&m[st.top()]==flag-3) st.pop();
            else {istrue=false;break;}
        }
        if(!st.empty()) istrue=false;
        return istrue;
    }
};

4、集合的用法

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        set<int> row, col;
        // 建立分別關聯行和列的 set 類型 row 和 col
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++)
                if(matrix[i][j] == 0)
                {
                    row.insert(i);
                    col.insert(j);
                }
        // 遍歷 set 並清零
        set<int>::iterator it;
        for(int i = 0; i < n; i ++)
            for(it = col.begin(); it != col.end(); it ++)
                matrix[i][*it] = 0;
        for(int i = 0; i < m; i ++)
            for(it = row.begin(); it != row.end(); it ++)
                matrix[*it][i] = 0;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章