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

C++中unordered_multiset容器用法示例詳解

 更新時(shí)間:2026年02月10日 08:30:58   作者:你的冰西瓜  
這篇文章主要介紹了C++中unordered_multiset容器用法的相關(guān)資料,unordered_multiset是以key為元素?zé)o序的關(guān)聯(lián)容器,搜索、移除和插入操作是平均常數(shù)的時(shí)間復(fù)雜度,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

1.unordered_multiset概述

unordered_multiset是C++11引入的關(guān)聯(lián)容器,基于哈希表實(shí)現(xiàn),允許存儲重復(fù)元素,提供快速的查找、插入和刪除操作,平均時(shí)間復(fù)雜度為O(1)O(1)O(1)。

2. 基本特性

  • 哈希表實(shí)現(xiàn):使用哈希函數(shù)組織元素
  • 允許重復(fù)元素:容器中可以包含多個(gè)相同值
  • 無序存儲:元素不以任何特定順序存儲
  • 快速訪問:平均情況下提供常數(shù)時(shí)間復(fù)雜度的查找
  • 動態(tài)大小:可以根據(jù)需要自動擴(kuò)展

3. 頭文件與聲明

#include <unordered_set>
using namespace std;

unordered_multiset<int> ums1;                  // 空unordered_multiset
unordered_multiset<string> ums2 = {"a", "b", "a"}; // 初始化列表(允許重復(fù))
unordered_multiset<double> ums3(10);           // 初始桶數(shù)為10

4. 構(gòu)造函數(shù)與初始化

4.1 默認(rèn)構(gòu)造

unordered_multiset<int> numbers;

4.2 范圍構(gòu)造

int arr[] = {1, 2, 2, 3, 3, 3};
unordered_multiset<int> nums(arr, arr+6);

4.3 拷貝構(gòu)造

unordered_multiset<int> ums2(ums1);

4.4 自定義哈希函數(shù)和相等比較

struct CaseInsensitiveHash {
    size_t operator()(const string& s) const {
        size_t h = 0;
        for(char c : s) {
            h += tolower(c);
        }
        return h;
    }
};

struct CaseInsensitiveEqual {
    bool operator()(const string& a, const string& b) const {
        if(a.length() != b.length()) return false;
        for(size_t i = 0; i < a.length(); ++i) {
            if(tolower(a[i]) != tolower(b[i])) return false;
        }
        return true;
    }
};

unordered_multiset<string, CaseInsensitiveHash, CaseInsensitiveEqual> case_insensitive_ms;

5. 容量操作

5.1size()

cout << ums.size();  // 返回元素總數(shù)量(包括重復(fù))

5.2empty()

if(ums.empty()) {
    cout << "unordered_multiset is empty";
}

5.3max_size()

cout << ums.max_size();  // 返回可容納的最大元素?cái)?shù)

6. 元素訪問

6.1 迭代器訪問

for(auto it = ums.begin(); it != ums.end(); ++it) {
    cout << *it << " ";
}

7. 修改操作

7.1insert()

ums.insert(10);                   // 插入單個(gè)元素
ums.insert({5, 5, 15});           // 插入初始化列表(允許重復(fù))
ums.insert(arr, arr+3);           // 插入范圍
auto it = ums.insert(20);         // 返回指向插入元素的迭代器

7.2emplace()

auto it = ums.emplace(30);        // 原地構(gòu)造元素

7.3erase()

ums.erase(5);                     // 刪除所有值為5的元素
auto it = ums.find(10);
if(it != ums.end()) {
    ums.erase(it);                // 只刪除一個(gè)10
}
ums.erase(ums.begin(), ums.end()); // 刪除范圍

7.4clear()

ums.clear();  // 清空所有元素

7.5swap()

unordered_multiset<int> ums2;
ums.swap(ums2);  // 交換兩個(gè)unordered_multiset

8. 查找操作

8.1find()

auto it = ums.find(10);  // 返回指向第一個(gè)10的迭代器
if(it != ums.end()) {
    cout << "Found: " << *it;
}

8.2count()

cout << ums.count(5);  // 返回元素5的數(shù)量

8.3equal_range()

auto range = ums.equal_range(15);  // 返回等于15的元素范圍[pair]
for(auto it = range.first; it != range.second; ++it) {
    cout << *it << " ";
}

9. 桶操作

9.1bucket_count()

cout << ums.bucket_count();  // 返回桶的數(shù)量

9.2max_bucket_count()

cout << ums.max_bucket_count();  // 返回最大桶數(shù)

9.3bucket_size()

cout << ums.bucket_size(2);  // 返回第2個(gè)桶中的元素?cái)?shù)

9.4bucket()

cout << ums.bucket("apple");  // 返回"apple"所在的桶索引

10. 哈希策略

10.1load_factor()

cout << ums.load_factor();  // 返回負(fù)載因子(元素?cái)?shù)/桶數(shù))

10.2max_load_factor()

cout << ums.max_load_factor();  // 返回最大負(fù)載因子
ums.max_load_factor(0.75);      // 設(shè)置最大負(fù)載因子

10.3rehash()

ums.rehash(20);  // 設(shè)置桶數(shù)為至少20

10.4reserve()

ums.reserve(100);  // 預(yù)留空間至少容納100個(gè)元素

11. 完整示例

#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;

int main() {
    // 創(chuàng)建并初始化unordered_multiset
    unordered_multiset<string> words = {"apple", "banana", "apple", "orange", "banana"};
    
    // 插入元素
    words.insert("grape");
    words.emplace("pear");
    words.insert({"apple", "kiwi", "kiwi"});
    
    // 查找元素
    cout << "Number of 'apple': " << words.count("apple") << endl;
    
    auto found = words.find("orange");
    if(found != words.end()) {
        cout << "Found orange at bucket #" << words.bucket(*found) << endl;
    }
    
    // 遍歷unordered_multiset
    cout << "All words: ";
    for(const auto& word : words) {
        cout << word << " ";
    }
    cout << endl;
    
    // 使用equal_range處理重復(fù)元素
    cout << "All apples: ";
    auto range = words.equal_range("apple");
    for(auto it = range.first; it != range.second; ++it) {
        cout << *it << " ";
    }
    cout << endl;
    
    // 刪除元素
    words.erase("banana");  // 刪除所有banana
    auto it = words.find("kiwi");
    if(it != words.end()) {
        words.erase(it);    // 只刪除一個(gè)kiwi
    }
    
    // 桶信息
    cout << "\nBucket information:" << endl;
    cout << "Number of buckets: " << words.bucket_count() << endl;
    cout << "Current load factor: " << words.load_factor() << endl;
    
    // 調(diào)整哈希表
    words.rehash(15);
    cout << "After rehash, bucket count: " << words.bucket_count() << endl;
    
    // 容量信息
    cout << "\nSize: " << words.size() << endl;
    cout << "Is empty: " << (words.empty() ? "Yes" : "No") << endl;
    
    return 0;
}

12. 性能提示

  1. 平均情況下查找、插入、刪除時(shí)間復(fù)雜度為O(1)O(1)O(1)
  2. 最壞情況下(哈希沖突嚴(yán)重)時(shí)間復(fù)雜度退化為O(n)O(n)O(n)
  3. 負(fù)載因子過高會影響性能,可適時(shí)rehash()
  4. 自定義類型需要提供哈希函數(shù)和相等比較
  5. 迭代器在插入操作后可能失效(重新哈希時(shí))

13. 與multiset比較

特性unordered_multisetmultiset
實(shí)現(xiàn)方式哈希表紅黑樹
元素順序無序自動排序
查找復(fù)雜度平均O(1)O(1)O(1)O(log?2n)O(\log_2 n)O(log2?n)
內(nèi)存使用通常較少通常較多
迭代器穩(wěn)定性插入可能失效穩(wěn)定(除刪除元素)

14. 與unordered_set比較

特性unordered_multisetunordered_set
元素唯一性允許重復(fù)不允許重復(fù)
count()返回值可能大于111000111
equal_range()常用于處理重復(fù)較少使用

總結(jié) 

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

相關(guān)文章

  • C語言實(shí)現(xiàn)簡單的貪吃蛇游戲

    C語言實(shí)現(xiàn)簡單的貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++的繼承和派生你了解嗎

    C++的繼承和派生你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++繼承和派生,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++中關(guān)鍵字const的詳細(xì)說明和使用介紹(最全)

    C++中關(guān)鍵字const的詳細(xì)說明和使用介紹(最全)

    const在C/C++中是十分重要的,如果單純理解為“常量”那么你的格局就小了,今天在這里給大家介紹一下const在C++中具體詳細(xì)的用法,需要的朋友可以參考下
    2025-03-03
  • C++實(shí)現(xiàn)從數(shù)組中同時(shí)取出最大最小元素算法示例

    C++實(shí)現(xiàn)從數(shù)組中同時(shí)取出最大最小元素算法示例

    這篇文章主要介紹了C++實(shí)現(xiàn)從數(shù)組中同時(shí)取出最大最小元素算法,結(jié)合具體實(shí)例形式分析了C++通過數(shù)組的遍歷、排序獲取最大與最小元素的相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Qt中const?QString轉(zhuǎn)換?char?*可能的坑

    Qt中const?QString轉(zhuǎn)換?char?*可能的坑

    本文主要介紹了Qt中const?QString轉(zhuǎn)換?char?*可能的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C++中cout的格式使用詳細(xì)介紹

    C++中cout的格式使用詳細(xì)介紹

    cout 是C++中 ostream 類型的對象,該類被封裝在 < iostream > 庫中,該庫定義的名字都在命名空間 std 中,所以 cout 全稱是 std::cout 。本文重點(diǎn)給大家介紹C++中cout的格式使用,需要的朋友參考下吧
    2021-06-06
  • C++中指針和引用的區(qū)別分析

    C++中指針和引用的區(qū)別分析

    這篇文章主要介紹了C++中指針和引用的區(qū)別,有需要的朋友可以參考一下
    2014-01-01
  • 基于c語言中調(diào)試工具的用法匯總(不包含gdb)

    基于c語言中調(diào)試工具的用法匯總(不包含gdb)

    本篇文章是對c語言中調(diào)試工具的用法進(jìn)行了匯總,需要的朋友參考下
    2013-05-05
  • C++拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載詳解

    C++拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載詳解

    拷貝構(gòu)造函數(shù)是特殊的構(gòu)造函數(shù),是用一個(gè)已經(jīng)存在的對象,賦值拷貝給另一個(gè)新創(chuàng)建的已經(jīng)存在的對象,這篇文章主要介紹了C++拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載,需要的朋友可以參考下
    2024-05-05
  • 用C++實(shí)現(xiàn)DBSCAN聚類算法

    用C++實(shí)現(xiàn)DBSCAN聚類算法

    本篇文章是對使用C++實(shí)現(xiàn)DBSCAN聚類算法的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

修武县| 雅安市| 炉霍县| 唐山市| 罗田县| 新竹县| 库伦旗| 芮城县| 万载县| 梅州市| 新郑市| 滨州市| 苍南县| 武乡县| 峨眉山市| 万山特区| 宜丰县| 鸡泽县| 汉源县| 西充县| 遂昌县| 朝阳区| 泸水县| 察雅县| 嘉荫县| 潮州市| 丹东市| 玛多县| 孝感市| 锦屏县| 郓城县| 汉阴县| 寻乌县| 尼勒克县| 太仓市| 六枝特区| 荆州市| 澄迈县| 木里| 连江县| 富顺县|