欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++?STL容器與函數(shù)謂詞示例分析講解

 更新時間:2022年11月22日 09:33:03   作者:lpf_wei  
這篇文章主要介紹了C++?STL容器與函數(shù)謂詞示例,STL是“Standard?Template?Library”的縮寫,中文譯為“標準模板庫”。STL是C++標準庫的一部分,不用單獨安裝

C++ STL(Standard Template Library標準模板庫),相當于java的集合模塊, STL 有很多的容器。

1.C++ vector向量

(內(nèi)部:封裝動態(tài)大小數(shù)組作為容器,能夠存放任意的動態(tài)數(shù)組)

#include <iostream>
#include <vector> // 引入 vector 容器的支持
// NDK 開發(fā) 一定要用容器  應該 queue 隊列
using namespace std;
int main() {
    vector<int> vector1;
    vector<int> vector2(10); // 指定10的空間大小
    vector<int> vector3(10, 0); // 有了10個值了 每個值都是0
    vector<int> vector4;
    // 插入數(shù)據(jù)
    vector4.insert(vector4.begin(), 40);
    vector4.insert(vector4.begin(), 60);
    vector4.insert(vector4.begin(), 80);
    // 第一個
    cout << " 修改前:vector4.front():" << vector4.front() << endl;
    vector4.front() = 99; // 默認修改第一個
    cout << " 修改后:vector4.front():" << vector4.front() << endl;
    // 最后一個
    cout << " 修改前:vector4.back():" << vector4.back() << endl;
    vector4.back() = 777; // 默認修改最后
    cout << " 修改后:vector4.back():" << vector4.back() << endl;
    vector4.erase(vector4.begin()); // 移除第一個元素(內(nèi)部:通過迭代器的位置 進行移除)  刪除
    // 循環(huán)打印,默認 從大到小輸出
    for (int i = 0; i < vector4.size(); ++i) {
        cout << "item:" << vector4[i] << endl;
    }
    // 迭代器 循環(huán)遍歷
    // auto Kotlin自帶類型推到
    // for (vector<int>::iterator iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {
    for (auto iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {
        // 迭代器 當中指針操作  iteratorVar++
        cout << "迭代器:" << *iteratorVar << endl;
    }
    cout << "" << endl;
    return 0;
}
  • vector4.begin() 迭代器 插入到前面
  • vector4.end() 迭代器 插入到后面

2.C++ stack 棧

#include <stack>
using namespace std;
int main() {
    stack<int> stackVar;
    stackVar.push(30);
    stackVar.push(60);
    stackVar.push(90);
    while (!stackVar.empty()) {
        int top = stackVar.top(); // top == 獲取棧頂?shù)脑?
        cout << "獲取棧頂?shù)脑兀? << top << endl; // 永遠拿 90
        stackVar.pop(); // 把棧頂?shù)脑?彈出去  【刪除】
    }
    return 0;
}

棧沒有迭代器,不能指定位置壓棧等

3.C++ queue 隊列

#include <queue>
using namespace std;
int main() {
    queue<int> queueVar;
    queueVar.push(20);
    queueVar.push(40);
    queueVar.push(60);
    // 第一個元素
    cout << " 修改前: queueVar.front():" << queueVar.front() << endl;
    queueVar.front() = 88;
    cout << " 修改后: queueVar.front():" << queueVar.front() << endl;
    // 最后一個
    cout << " 修改前: queueVar.back():" << queueVar.back() << endl;
    queueVar.back() =99;
    cout << " 修改后: queueVar.back():" << queueVar.back() << endl;
    while (!queueVar.empty()) {
        cout << "while1:" << queueVar.front() << endl;
        queueVar.pop(); // 把前面的元素 給消費掉  【刪除】
    }
    return 0;
}

queue隊列內(nèi)部是通過數(shù)組和鏈表實現(xiàn)的,這個數(shù)據(jù)結構應用場景比較多,音視頻編解碼啥的都會用到,遵守FIFO 原則。

4.優(yōu)先級隊列

#include <iostream>
#include <queue>
using namespace std;
int main() {
    // priority_queue<int> priorityQueue;
    priority_queue<int ,vector<int>, less<int>> priorityQueue;
    priorityQueue.push(10);
    priorityQueue.push(20);
    priorityQueue.push(30);
    priorityQueue.push(100);
    priorityQueue.push(50);
    priorityQueue.push(60);
    cout << priorityQueue.top() << endl; // 60
    // 循環(huán)代碼
    while (!priorityQueue.empty()) {
        cout << "while1:" << priorityQueue.top() << endl; 
        priorityQueue.pop(); // 最前面的元素消費掉
    }
    return 0;
}
  • priority_queue 內(nèi)部對我們前面的vector 有一定的封裝
  • 優(yōu)先級隊列會自動進行排序操作
  • priority_queue priorityQueue:這樣聲明優(yōu)先級隊列,相當于priority_queue<int ,vector, less> priorityQueue,省略了比較策略等
  • less return __x < __y: 從大到小
  • greater return __x > __y: 從小到大

5.C++ list

#include <iostream>
#include <list>
using namespace std;
int main() {
    list<char*> listVar;
    // 插入操作
    listVar.push_front("唐三"); // 插入到前面   明確
    listVar.push_back("小舞"); // 插入到后面
    listVar.insert(listVar.begin(),"寧榮榮"); // 插入到前面  靈活
    listVar.insert(listVar.end(), "馬紅俊"); // 插入到后面
//    // 修改操作
//    listVar.back() = 88;
//    listVar.front() = 55;
//    // 刪除
//    listVar.erase(listVar.begin()); // 刪除最前面的 55
//    listVar.erase(listVar.end()); // 刪除最后面的 88
    for (auto it = listVar.begin(); it != listVar.end() ; it ++) {
        cout << *it << endl;
    }
    return 0;
}
  • Java:ArrayList采用Object[]數(shù)組, C++的list 內(nèi)部:采用鏈表
  • 不用通過角標去訪問、修改 、遍歷

6.c++ set 集合

#include <iostream>
#include <set>
using namespace std;
int main() {
    set<int, less<int>> setVar;
    setVar.insert(1);
    setVar.insert(3);
    setVar.insert(2);
    setVar.insert(4);
    pair<set<int, less<int>>::iterator, bool> res = setVar.insert(4);
    bool insert_success = res.second;
    if (insert_success) {
        cout << "插入成功" << endl;
    } else {
        cout << "插入失敗" << endl;
    }
    for (auto it = setVar.begin(); it != setVar.end() ; it ++) {
        cout << *it << endl;
    }
    return 0;
}
  • set(內(nèi)部:紅黑樹結構),會對你存入的數(shù)據(jù)進行排序,不允許元素相同
  • __x < __y 從小到大,默認情況下 就是 less
  • 添加參數(shù),不需要用迭代器,也不需要指定位置
  • 重復插入,會提示插入失敗

7.C++ map函數(shù)

#include <iostream>
#include <map>
using namespace std;
int main() {
    // 注意:map會對key進行排序,默認 key不能重復
    map<int, string> mapVar;
    // TODO 添加數(shù)據(jù)
    // 第一種方式
    mapVar.insert(pair<int, string>(1, "唐三"));
    // 第二種方式
    mapVar.insert(make_pair(2, "小舞"));
    // 第三種方式
    mapVar.insert(map<int, string>::value_type (3, "寧榮榮"));
    // 上面三種方式 key不能重復
    // 思考:既然會對key進行排序,那么key是不能重復的(會插入失?。?
    std::pair<map<int,string>::iterator ,bool> r=mapVar.insert(pair<int, string>(3, "寧榮榮2"));   // 注意這個方式是插入失敗了
    //通過pair的方式
    if (r.second){
        cout << "插入成功" << endl;
    }else{
        cout << "插入失敗" << endl;
    }
    // 第四種方式    mapVar[key]=Value
    mapVar[4] = "馬紅俊";
    mapVar[4] = "比比東"; // 第四種方式覆蓋/替換(常用)
    /**
     *  typedef typename _Rep_type::iterator       iterator;  之前常規(guī)的迭代器
        typedef typename _Rep_type::const_iterator  const_iterator;  只讀的,只能讀,不能修改 的迭代器
        typedef typename _Rep_type::reverse_iterator    reverse_iterator;  倒序打印的迭代器
     */
    // 循環(huán)打印,迭代器
    for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {
        cout << it->first << "," << it->second.c_str() << "\t";
    }
    cout << endl;
    // 查找,操作
    map<int, string> ::iterator findResult = mapVar.find(3); // 查找
    if (findResult != mapVar.end()) {
        cout << "恭喜,找到了" << findResult->first << "," << findResult->second.c_str() << endl;
    } else {
        cout << "沒找到了" << endl;
    }
    //刪除元素
    mapVar.erase(5);    //如果刪除的元素不存在  也不會報錯
    // 循環(huán)打印,迭代器
    for (map<int, string>::iterator it = mapVar.begin() ; it != mapVar.end() ; it ++) {
        cout << it->first << "," << it->second.c_str() << "\t";
    }
    cout << endl;
    return 0;
}
  • 通過pair 插入數(shù)據(jù)如果id重復會插入失敗,不會覆蓋
  • 通過mapVar[4] = "馬紅俊"這個方式插入數(shù)據(jù),如果id重復會進行覆蓋
  • 通過erase函數(shù)刪除元素,如果id不存在不會報錯

8.C++ multimap容器

#include <iostream>
#include <map>
using namespace std;
int main() {
    multimap<int, string> multimapVar;
    multimapVar.insert(make_pair(10, "十個1"));
    multimapVar.insert(make_pair(10, "十個2"));
    multimapVar.insert(make_pair(10, "十個3"));
    multimapVar.insert(make_pair(30, "三十1"));
    multimapVar.insert(make_pair(30, "三十3"));
    multimapVar.insert(make_pair(30, "三十2"));
    multimapVar.insert(make_pair(20, "二十1"));
    multimapVar.insert(make_pair(20, "二十2"));
    multimapVar.insert(make_pair(20, "二十3"));
    for (auto iteratorVar = multimapVar.begin(); iteratorVar != multimapVar.end() ; iteratorVar ++) {
        cout << iteratorVar->first << "," << iteratorVar->second << endl;
    }
    cout << endl;
    int result;
    cout << "請輸入你要查詢的key,為int類型:" << endl;
    cin >> result;
    multimap<int, string>::iterator iteratorVar = multimapVar.find(result);
    while (iteratorVar != multimapVar.end()) {
        cout << iteratorVar->first << "," << iteratorVar->second << endl;
        iteratorVar++;
        if (iteratorVar->first != result) {
            break;;
        }
//        if (iteratorVar == multimapVar.end()) {
//            break;
//        }
    }
    return 0;
}
  • multimap核心功能是分組
  • multimap key可以重復,key重復的數(shù)據(jù)可以分組,key會自動進行排序

9.C++ 謂詞

c++ 謂詞 概念: 返回bool類型的仿函數(shù)稱為謂詞 。

如果operator()接受一個參數(shù),那么叫做一元謂詞 如果operator()接受兩個參數(shù),那么叫做二元謂詞。

#include <iostream>
#include <set>
using namespace std;
class Person {
public:
    string name;
    int id;
    Person(string name, int id) : name(name), id(id) {}
};
// 自定義謂詞 (仿函數(shù))
struct doCompareAction2 {
public:
    bool operator() (const Person& __x, const Person& __y) {
        return __x.id < __y.id;
    }
};
struct doCompareAction3 {
public:
    bool operator() (const Person& __x, const Person& __y) {
        return __x.id > __y.id;
    }
};
int main() {
    set<Person, doCompareAction2> setVar;
    // set<Person, doCompareAction3> setVar;
    // 構建對象
    Person p1 ("Snake", 1);
    Person p2 ("kevin", 2);
    Person p3 ("Derry", 3);
    // 把構建的對象 插入到 set 容器里面去
    setVar.insert(p1);
    setVar.insert(p2);
    setVar.insert(p3);
    for (set<Person>::iterator it = setVar.begin(); it != setVar.end() ; it ++) {
        cout << it->name.c_str() << " , " << it->id << endl;
    }
    return 0;
}
  • c++ Set集合,默認的謂詞不能對對象類型的比較,如果set集合傳入對象類型需要自定義謂詞來處理
  • 謂詞定義的規(guī)則:定義一個結構體,bool operator() 這部分是固定格式 參數(shù)部分是兩個常量引用類型數(shù)據(jù),返回比較兩個對象的維度就可以

10.C++內(nèi)置預定義函數(shù)

// C++ 預定義函數(shù)(C++ 內(nèi)置函數(shù))
#include <iostream>
using namespace std;
int main() {
    // "Derry" + "AAAA" // 運算符重載
    // C++已經(jīng)提供了 預定義函數(shù)  plus,minus,multiplies,divides,modulus ...
    plus<int> add_func;
    int r = add_func(1, 1);
    cout << r << endl;
    plus<string> add_func2;
    string r2 = add_func2("AAAA", "BBB");
    cout << r2 << endl;
    plus<float> add_func3;
    float r3 = add_func3(4354.45f, 34.3f);
    cout << r3 << endl;
    return 0;
}

到此這篇關于C++ STL容器與函數(shù)謂詞示例分析講解的文章就介紹到這了,更多相關C++ STL容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 二叉搜索樹(BST)的實現(xiàn)方法

    C++ 二叉搜索樹(BST)的實現(xiàn)方法

    這篇文章主要介紹了C++ 二叉搜索樹(BST)的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的的朋友參考下
    2017-04-04
  • C++實現(xiàn)線性代數(shù)矩陣行簡化

    C++實現(xiàn)線性代數(shù)矩陣行簡化

    這篇文章主要為大家詳細介紹了C++實現(xiàn)線性代數(shù)矩陣行簡化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 用C實現(xiàn)添加和讀取配置文件函數(shù)

    用C實現(xiàn)添加和讀取配置文件函數(shù)

    本篇文章是對用C語言實現(xiàn)添加和讀取配置文件函數(shù)的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Visual Studio 2019修改編碼UTF-8的實現(xiàn)

    Visual Studio 2019修改編碼UTF-8的實現(xiàn)

    這篇文章主要介紹了Visual Studio 2019修改編碼UTF-8的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C++二維數(shù)組中的查找算法示例

    C++二維數(shù)組中的查找算法示例

    這篇文章主要介紹了C++二維數(shù)組中的查找算法,結合實例形式分析了C++二維數(shù)組進行查找的原理與具體實現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • C++詳細分析引用的使用及其底層原理

    C++詳細分析引用的使用及其底層原理

    引用是C++一個很重要的特性,顧名思義是某一個變量或對象的別名,對引用的操作與對其所綁定的變量或對象的操作完全等價,這篇文章主要給大家總結介紹了C++中引用的相關知識點,需要的朋友可以參考下
    2022-04-04
  • C/C++實現(xiàn)全排列算法的示例代碼

    C/C++實現(xiàn)全排列算法的示例代碼

    本文主要介紹了C/C++實現(xiàn)全排列算法的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • c++中用TINYXML解析XML文件

    c++中用TINYXML解析XML文件

    這篇文章主要介紹了c++中如何用TINYXML解析XML文件,文中案例非常詳細,幫助大家更好的了解和學習,感興趣的朋友可以了解下
    2020-06-06
  • C++實現(xiàn)中綴轉后綴的示例詳解

    C++實現(xiàn)中綴轉后綴的示例詳解

    這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)中綴轉后綴的問題,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android App仿微信界面切換時Tab圖標變色效果的制作方法

    Android App仿微信界面切換時Tab圖標變色效果的制作方法

    這篇文章主要介紹了Android App仿微信界面切換時Tab圖標變色效果的制作方法,重點講解了圖標的繪制技巧,需要的朋友可以參考下
    2016-04-04

最新評論