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

C++實(shí)現(xiàn)std::set的示例項(xiàng)目

 更新時間:2025年02月18日 10:14:24   作者:kucupung  
std::set是C++標(biāo)準(zhǔn)庫中的關(guān)聯(lián)容器,提供有序唯一元素集合,本文就來介紹一下std::set的具體使用,具有一定的參考價值,感興趣的可以了解一下

std::set 是 C++ 標(biāo)準(zhǔn)庫中的關(guān)聯(lián)容器,它提供了一種存儲唯一元素的有序集合。它提供了高效的插入、刪除和查找操作,并且能夠自動維護(hù)元素的有序性和唯一性。

一、底層實(shí)現(xiàn)

std::set 的底層原理是基于紅黑樹(Red-Black Tree)。紅黑樹是一種自平衡的二叉搜索樹,保證了樹的平衡性,從而保證了插入、刪除和查找操作的時間復(fù)雜度為 O(log n)。它滿足以下性質(zhì):

1、 每個節(jié)點(diǎn)要么是紅色,要么是黑色。
2、 根節(jié)點(diǎn)是黑色的。(插入的第一個元素)
3、 所有葉子節(jié)點(diǎn)(NIL 節(jié)點(diǎn))都是黑色的。
4、 如果一個節(jié)點(diǎn)是紅色的,則它的兩個子節(jié)點(diǎn)都是黑色的。
5、 對于每個節(jié)點(diǎn),從該節(jié)點(diǎn)到其后代葉子節(jié)點(diǎn)的簡單路徑上,黑色節(jié)點(diǎn)的數(shù)量都相同。

在 std::set 中,每個元素都被 插入到紅黑樹中作為一個節(jié)點(diǎn)。當(dāng)插入一個新元素時,std::set 會根據(jù)元素值的大小將其插入到合適的位置,同時保持紅黑樹的平衡性。在紅黑樹中查找元素時,根據(jù)紅黑樹的特性,可以通過二分查找的方式高效地定位到目標(biāo)元素。
由于紅黑樹是一種高效的自平衡二叉搜索樹,因此 std::set 能夠提供高效的插入、刪除和查找操作,同時保持元素的有序性和唯一性。

二、成員函數(shù)

std::set提供了一系列成員函數(shù)來操作集合。

  • insert: 向集合中插入元素。
  • emplace: 在集合中就地構(gòu)造元素。
  • erase: 從集合中刪除指定元素。
  • find: 查找集合中是否存在指定元素。
  • count: 返回集合中與指定元素相等的元素的數(shù)量(通常為0或1)。
  • clear: 清空集合中的所有元素。
  • size: 返回集合中元素的數(shù)量。
  • empty: 檢查集合是否為空。
  • swap: 交換兩個集合的內(nèi)容。
  • begin: 返回指向集合中第一個元素的迭代器。
  • end: 返回指向集合中最后一個元素之后位置的迭代器。
  • lower_bound: 返回指向第一個不小于給定鍵值的元素的迭代器。
  • upper_bound: 返回指向第一個大于給定鍵值的元素的迭代器。
  • equal_range: 返回一個范圍,其中包含所有與給定鍵值相等的元素。
  • max_size: 返回集合能容納的最大元素?cái)?shù)量。

Demo演示:

std::set<int> set1;
set1.insert(1);
set1.insert(2);
set1.insert(3);
set1.insert(4);
std::cout<<set1.size()<<std::endl; // 4
std::cout<<set1.empty()<<std::endl; // 0
std::cout<<*set1.find(2)<<std::endl; // 2
set1.erase(2);
std::cout<<(set1.find(2)==set1.end())<<std::endl; // 1
std::cout<<set1.count(3)<<std::endl; // 1
auto lower = set1.lower_bound(3);
auto upper = set1.upper_bound(3);
std::cout << "Lower bound of 3: " << *lower << std::endl; // Lower bound of 3: 3
std::cout << "Upper bound of 3: " << *upper << std::endl; // Upper bound of 4: 4
std::set<int> set2;
set2.swap(set1);
std::cout<<set1.size()<<" "<<set2.size()<<std::endl; // 0 3
std::cout<<set1.max_size()<<std::endl; // 230584300921369395
for (auto it = set2.begin(); it != set2.end(); ++it) {
    std::cout << *it << " "<<std::endl; // 1 3 4
}
auto range = set2.equal_range(3);
std::cout<<*range.first<<std::endl; // 3

三、自定義排序規(guī)則

std::set 默認(rèn)是根據(jù)元素的大小進(jìn)行排序的,采用的是嚴(yán)格弱序(Strict Weak Ordering)的比較方式。這意味著元素必須支持 < 運(yùn)算符,元素按照升序排列。

可以通過提供自定義的比較函數(shù)或者函數(shù)對象來實(shí)現(xiàn)排序規(guī)則。需要兩個步驟:
1、 定義比較函數(shù)或者函數(shù)對象
比較函數(shù):定義一個函數(shù),接受兩個參數(shù),比較它們的大小,并返回 true 或 false,表示它們的順序關(guān)系。
函數(shù)對象(Functor):定義一個類,重載 operator(),使得對象可以像函數(shù)一樣被調(diào)用,在其中實(shí)現(xiàn)比較邏輯。

2、 傳遞比較函數(shù)或者函數(shù)對象給 std::set 構(gòu)造函數(shù)
在創(chuàng)建 std::set 對象時,通過傳遞比較函數(shù)或者函數(shù)對象作為第二個參數(shù),告訴集合如何比較元素的順序。

#include <iostream>
#include <set>

// 自定義比較函數(shù)
bool customCompare(int a, int b) {
    // 實(shí)現(xiàn)自定義的比較邏輯,這里以整數(shù)的絕對值大小為例
    return abs(a) < abs(b);
}

// 自定義函數(shù)對象(Functor)
struct CustomComparator {
    bool operator()(int a, int b) const {
        // 實(shí)現(xiàn)自定義的比較邏輯,這里以整數(shù)的平方大小為例
        return (a * a) < (b * b);
    }
};

int main() {
    // 使用自定義比較函數(shù)創(chuàng)建 std::set
    std::set<int, decltype(&customCompare)> customSet(customCompare);

    // 使用自定義函數(shù)對象創(chuàng)建 std::set
    std::set<int, CustomComparator> functorSet;

    // 插入元素
    customSet.insert(5);
    customSet.insert(-3);
    customSet.insert(2);

    functorSet.insert(5);
    functorSet.insert(-3);
    functorSet.insert(2);

    // 遍歷輸出結(jié)果
    std::cout << "Custom compare function set: ";
    for (int num : customSet) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    std::cout << "Functor set: ";
    for (int num : functorSet) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

四、自定義對象排序

當(dāng) std::set 中存儲的元素是自定義對象時,需要重載 < 運(yùn)算符,以便 std::set 能夠?qū)ο筮M(jìn)行比較和排序。重載 < 運(yùn)算符的目的是定義對象之間的比較規(guī)則,以確定它們在集合中的順序。這樣,std::set 就可以使用這些規(guī)則來維護(hù)集合的有序性。
下面是一個示例,演示了如何定義一個自定義類型的 Person 對象,并在 std::set 中使用自定義的比較函數(shù)進(jìn)行排序:

#include <iostream>
#include <set>
#include <string>

// 定義一個自定義的 Person 類
class Person {
private:
    std::string name;
    int age;

public:
    Person(std::string name, int age) : name(name), age(age) {}

    // 重載 < 運(yùn)算符,用于自定義對象的比較規(guī)則
    bool operator<(const Person& other) const {
        // 按照年齡進(jìn)行比較
        return age < other.age;
    }

    // 為了便于輸出,重載 << 運(yùn)算符
    friend std::ostream& operator<<(std::ostream& os, const Person& person) {
        os << "Name: " << person.name << ", Age: " << person.age;
        return os;
    }
};

int main() {
    // 創(chuàng)建一個存儲 Person 對象的 std::set 容器,并使用自定義的比較函數(shù)進(jìn)行排序
    std::set<Person> people;

    // 向集合中插入一些 Person 對象
    people.insert(Person("Alice", 30));
    people.insert(Person("Bob", 25));
    people.insert(Person("Charlie", 35));

    // 遍歷輸出集合中的元素,由于使用了自定義的比較規(guī)則,輸出時會按照年齡升序排列
    for (const auto& person : people) {
        std::cout << person << std::endl;
    }

    return 0;
}

在這個示例中,Person 類具有 name 和 age 兩個屬性,我們通過重載 < 運(yùn)算符來定義了對象之間的比較規(guī)則,按照年齡進(jìn)行比較。然后,我們創(chuàng)建了一個 std::set<Person> 容器,并向其中插入了幾個 Person 對象。由于我們使用了自定義的比較函數(shù),因此在輸出容器中的元素時,它們會按照年齡的升序排列。

五、性能問題

std::set 在插入、刪除和查找等操作上具有穩(wěn)定且良好的性能特征,適用于需要高效管理有序唯一元素集合的場景。然而,在空間效率方面,它可能不如其他數(shù)據(jù)結(jié)構(gòu)(如 std::unordered_set)那么優(yōu)越。因此,在選擇數(shù)據(jù)結(jié)構(gòu)時,需要根據(jù)具體的需求權(quán)衡其性能特征。

1、 插入和刪除操作的性能
插入和刪除操作的時間復(fù)雜度為 O(log n),其中 n 是集合中的元素?cái)?shù)量。這是因?yàn)榧t黑樹是一種自平衡的二叉搜索樹,插入和刪除操作會導(dǎo)致樹的重新平衡,但是由于紅黑樹的特性,重新平衡的代價是受控的。
因此,std::set 在插入和刪除方面的性能比較穩(wěn)定,不受集合大小的影響。

2、 查找操作的性能
查找操作的時間復(fù)雜度也是 O(log n),因?yàn)榧t黑樹具有良好的平衡性,可以保證在平均情況下快速地查找元素。
std::set 提供了高效的查找功能,適用于需要快速檢索元素的場景。

3、 迭代器的性能
std::set 的迭代器是雙向迭代器,支持前向和后向遍歷,其性能與集合大小無關(guān),是常數(shù)時間復(fù)雜度的操作。
這意味著在遍歷 std::set 中的元素時,無論集合大小如何,迭代器的操作都非常高效。

4、 內(nèi)存占用
std::set 使用紅黑樹作為底層數(shù)據(jù)結(jié)構(gòu),它是一種高效的平衡二叉搜索樹,但是相對于其他數(shù)據(jù)結(jié)構(gòu)(如哈希表),它可能會占用更多的內(nèi)存。
紅黑樹需要維護(hù)額外的節(jié)點(diǎn)信息以保持平衡,因此在存儲相同數(shù)量的元素時,std::set 可能會占用更多的內(nèi)存空間。

到此這篇關(guān)于C++實(shí)現(xiàn)std::set的示例項(xiàng)目的文章就介紹到這了,更多相關(guān)C++ std::set內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中vector操作方式詳解(多種方式)

    C++中vector操作方式詳解(多種方式)

    這篇文章主要介紹了C++中vector操作方式詳解(多種方式),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • C語言調(diào)用Python代碼的方法

    C語言調(diào)用Python代碼的方法

    這篇文章主要介紹了C語言調(diào)用Python代碼的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 一起來學(xué)習(xí)C++的函數(shù)指針和函數(shù)對象

    一起來學(xué)習(xí)C++的函數(shù)指針和函數(shù)對象

    這篇文章主要為大家詳細(xì)介紹了C++函數(shù)指針和函數(shù)對象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言和go語言之間的交互操作方法

    C語言和go語言之間的交互操作方法

    下面小編就為大家?guī)硪黄狢語言和go語言之間的交互操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • C++實(shí)現(xiàn)掃雷游戲

    C++實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++實(shí)現(xiàn)打地鼠游戲設(shè)計(jì)

    C++實(shí)現(xiàn)打地鼠游戲設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)打地鼠游戲設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • c++函數(shù)指針和回調(diào)函數(shù)示例

    c++函數(shù)指針和回調(diào)函數(shù)示例

    這篇文章主要介紹了c++函數(shù)指針和回調(diào)函數(shù)示例,需要的朋友可以參考下
    2014-05-05
  • 快速學(xué)習(xí)C語言中for循環(huán)語句的基本使用方法

    快速學(xué)習(xí)C語言中for循環(huán)語句的基本使用方法

    這篇文章主要簡單介紹了C語言中for循環(huán)語句的基本使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • C++編譯/編輯器對OIer的必要功能(推薦)

    C++編譯/編輯器對OIer的必要功能(推薦)

    這篇文章主要介紹了C++編譯/編輯器對OIer的必要功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • C++中的內(nèi)存對齊實(shí)例詳解

    C++中的內(nèi)存對齊實(shí)例詳解

    這篇文章主要介紹了C++中的內(nèi)存對齊實(shí)例詳解的相關(guān)資料,這里不僅提供實(shí)現(xiàn)方法及代碼還提供了手工制作圖,來幫助到大家理解這部分知識,需要的朋友可以參考下
    2017-07-07

最新評論

攀枝花市| 沈丘县| 微博| 南投县| 葫芦岛市| 通化市| 大庆市| 阜南县| 肇庆市| 永年县| 万州区| 盐边县| 微博| 东辽县| 乌拉特后旗| 黎城县| 江山市| 华亭县| 含山县| 鲜城| 大名县| 榆中县| 泊头市| 无锡市| 临泉县| 西乌珠穆沁旗| 古浪县| 静宁县| 安仁县| 洛阳市| 柘城县| 宜丰县| 临邑县| 沾化县| 达尔| 永宁县| 梧州市| 南召县| 蕲春县| 类乌齐县| 堆龙德庆县|