最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中map和set的使用及示例

 更新時間:2024年01月28日 09:36:59   作者:初階牛  
map和set是STL容器中的部分,本文主要介紹了C++中map和set的使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、set

1.1 set特點介紹

set的介紹
C++中的set是一個STL容器,它是一個自動排序的集合(即將數(shù)據(jù)存入set,我們通過迭代器順序訪問出來時,數(shù)據(jù)是有序的),內(nèi)部使用紅黑樹(后面會講解)來實現(xiàn)。它的特點是不允許重復元素,而且插入元素時自動進行排序。

set容器的特點

  • 存入set后數(shù)據(jù)有序: set是按照一定次序存儲元素的容器,迭代器迭代出來的數(shù)據(jù)是有序的。
  • 數(shù)據(jù)唯一(可以用于去重):每個value必須是唯一的。set中的元素不能在容器中修改(元素總是const),但是可以從容器中插入或刪除它們。
  • set在底層是用二叉搜索樹(紅黑樹)實現(xiàn)的。
    注意:
  • set中查找某個元素,時間復雜度為: log2?n,因為底層是紅黑樹。

1.2 set使用

1.21 構(gòu)造函數(shù)

在這里插入圖片描述

(來源于:官方文檔

測試構(gòu)造:

	//測試構(gòu)造
	void test_Construct() {
    set<int> s1;//普通構(gòu)造
    
   //迭代器構(gòu)造
   //數(shù)組
    int arr[] = { 2,2,1,1,5,5,5,1,7,9,8,10 };
    set<int> s2(arr,arr+sizeof(arr)/sizeof(int));    //默認就是升序
    cout << "s2: ";
    for (auto it : s2) {
        cout << it << " ";
    }
    cout << endl;
	//vector
    vector<int> v = { 2,2,1,1,5,5,5,1,7,9,8,10 };
    set<int> s3(v.begin(), v.end());    //默認就是升序
    cout << "s3: ";
    for (auto it : s3) {
        cout << it << " ";
    }
    cout << endl;

    //拷貝構(gòu)造
    set<int> s4(s3);
    cout << "s4: ";
    for (auto it : s3) {
        cout << it << " ";
    }
    cout << endl;
}

運行結(jié)果:

s2: 1 2 5 7 8 9 10
s3: 1 2 5 7 8 9 10
s4: 1 2 5 7 8 9 10

1.22 升/降序

void test_cmp() {
    //set 降序
    set<int, less<int>> s1;
    s1.insert(3);
    s1.insert(5);
    s1.insert(2);
    s1.insert(6);
    s1.insert(7);
    s1.insert(10);
    s1.insert(9);
    s1.insert(1);
    s1.insert(4);
    s1.insert(8);
    cout << "升序:s1: ";
    for (auto it : s1) {
        cout << it << " ";
    }
    cout << endl;

    //set升序
    set<int, greater<int>> s2;
    s2.insert({3,5,2,6,7,10,9,1,4,8});
    cout << "降序:s2: ";
    for (auto it : s2) {
        cout << it << " ";
    }
    cout << endl;
}

運行結(jié)果:

升序:s1: 1 2 3 4 5 6 7 8 9 10
降序:s2: 10 9 8 7 6 5 4 3 2 1

1.23 其他接口

(1) 容量(capacity)相關(guān):

接口名介紹
empty( )檢測set是否為空,空返回true,否則返回false
size()獲取set中有效數(shù)據(jù)的個數(shù)

(2)Modifiers(修改)

在這里插入圖片描述
在這里插入圖片描述

接口名解釋
insert向set中插入數(shù)據(jù),可以是迭代器區(qū)間們也可以是單個的值
erase刪除指定位置的數(shù)據(jù)(可以提供迭代器,也可以是元素值)
void swap (set& x);交換兩個set
void clear();清除set中的數(shù)據(jù)

(3)查找

接口名解釋
iterator find (const value_type& val) const;查找元素 ,返回該元素的迭代器
size_type count (const value_type& val) const;返回目標元素在set中出現(xiàn)的次數(shù)(由于set是不予訊重復元素的,所以這個接口意義不大)
	void test() {
    set<int, greater<int>> s1;
    s1.insert({ 3,5,2,6,7,10,9,1,4,8 });

    cout << "有效數(shù)據(jù)的個數(shù): " << s1.size() << endl;
    cout << "是否為空容器:  " << s1.empty() << endl;
    //在set中意義不大的函數(shù)
    cout << "容器中元素3出現(xiàn)了:  " << s1.count(3) << endl;
    set<int>:: iterator it = s1.find(2);        //找到則返回這個元素的迭代器,沒找到,則返回end()
    cout <<"find(2): "<< * it << endl;

    set<int, greater<int>> s2;
    s2.insert({ 1,5,8 });

    cout << "交換前:"<<endl;
    cout << "s1: ";
    for (auto it : s1) {
        cout << it << " ";
    }
    cout << endl;

    cout << "s2: ";
    for (auto it : s2) {
        cout << it << " ";
    }
    cout << endl;

    swap(s1, s2);

    cout << "交換后:" << endl;
    cout << "s1: ";
    for (auto it : s1) {
        cout << it << " ";
    }
    cout << endl;

    cout << "s2: ";
    for (auto it : s2) {
        cout << it << " ";
    }
    cout << endl;

    s1.clear();
    cout << "清除:s1: ";
    for (auto it : s1) {
        cout << it << " ";
    }
    cout << endl;
}

運行結(jié)果:

有效數(shù)據(jù)的個數(shù): 10
是否為空容器: 0
容器中元素3出現(xiàn)了: 1
find(2): 2
交換前:
s1: 10 9 8 7 6 5 4 3 2 1
s2: 8 5 1
交換后:
s1: 8 5 1
s2: 10 9 8 7 6 5 4 3 2 1
清除:s1:

二、map

2.1 map的特點介紹

map是一個關(guān)聯(lián)容器,它提供了一種存儲鍵值對的方法。它是按照鍵(key)進行排序和存儲的,鍵必須是唯一的,而值(value)可以重復。map通常使用紅黑樹實現(xiàn),所以它的查找、插入和刪除操作的時間復雜度都是O(log n)。

那么何為鍵值對?
鍵值對是一種常用的數(shù)據(jù)存儲結(jié)構(gòu),由“鍵”和“值”兩部分組成。其中,“鍵”是唯一的,用于標識數(shù)據(jù),而“值”則是與鍵相關(guān)聯(lián)的數(shù)據(jù)。
其實很簡單,例如: {“apple”, “蘋果”}

下面是pair大概實現(xiàn):

template <typename T1, typename T2> 
struct pair {
    T1 first;		//鍵
    T2 second;		//值
    pair() : first(), second() {}
    pair(const T1& x, const T2& y): first(x), second(y) {}
    template <typename U1, typename U2>
    pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
    pair& operator=(const pair& rhs) {
        if (this != &rhs) {
            first = rhs.first;
            second = rhs.second;
        }
        return *this;
    }
};

2.2 map的使用

在這里插入圖片描述

mapset的用法基本相同,只不過一個是鍵值對,一個是單個的值。
這里對于map就不過多介紹了。

?構(gòu)造函數(shù)

	void test_map() {
    // 構(gòu)造空的map
    map<string, int> map1;
    cout << "map1:" << endl;
    for (auto it : map1) {
        cout << it.first << it.second << endl;
    }
    cout << endl;

    // 使用初始化列表構(gòu)造
    map<string, string> map2{
        {"apple", "蘋果"},
        {"banana", "香蕉"},
        {"orange", "橘子"}
    };
    cout << "map2:" << endl;
    for (auto it : map2) {
        cout << it.first << it.second << endl;
    }
    cout << endl;

    // 構(gòu)造map并插入元素
    map<string, int> map3;
    map3.insert(pair<string, int>("panda", 1));
    map3.insert(make_pair("", 2));
    map3.insert(map<string, int>::value_type("monkey", 3));
    cout << "map3:" << endl;
    for (auto it : map3) {
        cout << it.first << it.second << endl;
    }
    cout << endl;
    cout << "空格對應(yīng)的值:" << map3[""];
}

運行結(jié)果:

map1:

map2:
apple蘋果
banana香蕉
orange橘子

map3:
2
monkey3
panda1

空格對應(yīng)的值:2

??[ ]的作用

在這里插入圖片描述

在 C++ 中,map 中的 [] 運算符可以用于訪問和修改 map 中的元素,其作用如下:

  • 若鍵值存在,返回對應(yīng)的值;
  • 若鍵值不存在,會與這個不存在的key和默認值構(gòu)成一個鍵值對,自動插入默,并返回該默認值的引用。
	void test() {
    std::map<std::string, int> my_map;
    my_map["apple"] = 2;
    my_map["banana"] = 3;
    cout << "my_map 變化前" << endl;
    for (auto it : my_map) {
        cout << it.first << " : " << it.second << endl;
    }
    cout << endl;

    std::cout << my_map["apple"] << std::endl; // 輸出 2
    std::cout << my_map["pear"] << std::endl;  // 輸出默認值 0

    cout << "my_map 變化后" << endl;
    for (auto it : my_map) {
        cout << it.first << " : " << it.second << endl;
    }
    cout << endl;

}

運行結(jié)果:

my_map 變化前
apple : 2
banana : 3

2
0
my_map 變化后
apple : 2
banana : 3
pear : 0

在這里插入圖片描述

注意map可以通過[key]訪問對應(yīng)的value。

關(guān)于map,本篇就主要介紹這[ ]接口了。

三、實例

??兩個數(shù)組的交集

(1)關(guān)于set的示例使用:
set在oj題中的應(yīng)用
題目名稱:兩個數(shù)組的交集
題目鏈接: 傳送門(聲明:題目來源于“力扣”)

題目描述
給定兩個數(shù)組 nums1 和 nums2 ,返回 它們的交集 。輸出結(jié)果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結(jié)果的順序 。

在這里插入圖片描述

解題思路:
將兩個數(shù)組分別進set中去重得到s1s2,然后將其中一個與另一個比較,判斷是否存在則是交集。

示例代碼:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> ret;    //用于返回結(jié)構(gòu)的數(shù)組
        //先通過set去重
        set<int> s1;
        for(int& it:nums1){
            s1.insert(it);
        }

        set<int> s2;
        for(int& it:nums2){
            s2.insert(it);
        }

        for(auto& it:s1){
            if(s2.count(it)){    //表示s1中的值在s2中可以找到
                ret.push_back(it);
            }
        }
        return ret;
    }
};

??單詞識別

(2)關(guān)于map的使用

題目描述:
輸入一個英文句子,把句子中的單詞(不區(qū)分大小寫)按出現(xiàn)次數(shù)按從多到少把單詞和次數(shù)在屏幕上輸出來,次數(shù)一樣的按照單詞小寫的字典序排序輸出,要求能識別英文單詞和句號。

在這里插入圖片描述

  • 由于不區(qū)分大小寫,可以先將字符串中所有的字母轉(zhuǎn)化為小寫。
  • 將字符串按照空格劃分,劃分為一個個單詞word。
  • 將單詞存入map,沒出現(xiàn)一次單詞,該單詞的次數(shù)就+1;
  • 最后按迭代器跑一遍即可。

示例代碼:

#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;

int main() {
    string sentence;
    getline(cin, sentence);
    //全部轉(zhuǎn)化為小寫
    for (auto& it : sentence) {
        if (it >= 'A' && it <= 'Z') {
            it += 32;
        }
    }
    auto left = sentence.begin();
    auto right = left;
    map<string, int, less<string>> m;
    for (int i = 0; i < sentence.size(); i++) {
        right = sentence.begin();
        if (sentence[i] == ' ' || sentence[i] == '.')
        {
            right += i;
            string word(left, right);
            left = right + 1;
            m[word]++;
        }
    }

    for (auto& it : m) {
        cout << it.first << ":" << it.second << endl;
    }
    return 0;
}

到此這篇關(guān)于C++中map和set的使用小結(jié)的文章就介紹到這了,更多相關(guān)C++ map set內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中命名空間(namespace)詳解及其作用介紹

    C++中命名空間(namespace)詳解及其作用介紹

    考慮一種情況,當我們有兩個同名的人,Zara,在同一個班里。當我們需要對它們進行區(qū)分我們必須使用一些額外的信息和它們的名字,比如它們生活在不同的區(qū)域或者興趣愛好什么的,在C++程序中也會遇到同樣的情況,所以命名空間就此產(chǎn)生
    2022-08-08
  • C語言之快速排序案例詳解

    C語言之快速排序案例詳解

    這篇文章主要介紹了C語言之快速排序案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 適合新手小白DEV?C++的使用方法

    適合新手小白DEV?C++的使用方法

    Dev-C++是一個Windows環(huán)境下C/C++的集成開發(fā)環(huán)境(IDE),它是一款自由軟件,遵守GPL,下面這篇文章主要給大家介紹了關(guān)于適合新手小白DEV?C++的使用方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬能頭文件)

    關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬能頭文件)

    #include<bits/stdc++.h>包含了目前 C++ 所包含的所有頭文件,又稱萬能頭文件,那么如何在VS2022中使用萬能頭呢?下面小編給大家代理了關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬能頭文件),感興趣的朋友一起看看吧
    2022-03-03
  • 詳解C/C++ 的*和&用法

    詳解C/C++ 的*和&用法

    這篇文章主要介紹了C/C++ 的*和&的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 深入理解Java事務(wù)的原理與應(yīng)用

    深入理解Java事務(wù)的原理與應(yīng)用

    下面小編就為大家?guī)硪黄钊肜斫釰ava事務(wù)的原理與應(yīng)用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • C++實現(xiàn)基于不相交集合的O(mlgn)復雜度的kruskal算法

    C++實現(xiàn)基于不相交集合的O(mlgn)復雜度的kruskal算法

    這篇文章主要為大家詳細介紹了C++如何實現(xiàn)基于不相交集合的O(mlgn)復雜度的kruskal算法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-02-02
  • OpenCV實現(xiàn)二值圖像的邊緣光滑處理

    OpenCV實現(xiàn)二值圖像的邊緣光滑處理

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)二值圖像的邊緣光滑處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言光標信息CONSOLE_CURSOR_INFO類型詳解

    C語言光標信息CONSOLE_CURSOR_INFO類型詳解

    本文詳細講解了C語言光標信息CONSOLE_CURSOR_INFO類型,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • C++ Boost Phoenix庫示例分析使用

    C++ Boost Phoenix庫示例分析使用

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11

最新評論

滕州市| 辽宁省| 抚松县| 五指山市| 栾城县| 垣曲县| 灵石县| 壶关县| 特克斯县| 左云县| 凌海市| 满洲里市| 左权县| 普格县| 阳谷县| 五常市| 巴马| 小金县| 得荣县| 汕尾市| 滕州市| 肥乡县| 筠连县| 甘南县| 琼海市| 文成县| 梁河县| 姚安县| 嘉鱼县| 珲春市| 舟曲县| 阿城市| 抚州市| 霍林郭勒市| 新安县| 丹巴县| 苗栗县| 化德县| 桦南县| 固镇县| 上蔡县|