C++ containers——sets (unordered_multiset)

1 Introduction

unordered_multiset is an associative container whose key value allows repetition ; adding, modifying and querying have linear time complexity, and its storage structure is a hash table; elements are not stored in a specific order, but are organized into buckets , in which bucket depends on its hash value;

header files and definitions

#include <unordered_set>

template<
    class Key,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator<Key>
> class unordered_multiset;

2. Initialization

The initialization of unordered_multiset looks like this

/*
* @brief unordered_multiset 
* @g++ -g unordered_multiset_main.cc -o d -std=c++11
* @author 
* @date 2023/03/27
*/

#include <iostream>
#include <unordered_set>
#include <string>
#include <iterator>

template<typename T>
void showInfo(T& t)
{
    
    
    for(const auto& au : t)
    {
    
    
        std::cout<<au<<"  ";
    }
    std::cout<<std::endl;
}


int main(int argc, char* argv[])
{
    
       
    //直接初始化     
    std::unordered_multiset<std::string> un_s1{
    
    "c++", "c", "Rust", "golang", "Rust","Rust","linux", "matlab"};
    showInfo(un_s1);

    std::unordered_multiset<std::string> un_s2;
    un_s2.emplace("student");
    un_s2.emplace("student");
    un_s2.insert("teacher");
    un_s2.insert("teacher");

    //拷贝初始化
    std::unordered_multiset<std::string> un_s3 = un_s2;
    showInfo(un_s3);
    
    return 0;    
}

output

linux  golang  Rust  Rust  Rust  matlab  c  c++
teacher  teacher  student  student

3. use

It supports the same operations as unordered_set ;

However, for methods such as count(), find(), equal_range(), unordered_multiset plays a greater role

example

int main(int argc, char* argv[])
{
    
       
    //操作 count()  find()   equal_range()
    std::unordered_multiset<std::string> un_s1{
    
    "c++", "c", "Rust", "golang", "Rust","Rust","linux", "matlab"};
    showInfo(un_s1);
    std::cout<<"\ncount() of Rust is: "<<un_s1.count("Rust")<<"\n\n";

    std::cout<<"[find() test]\n";
    auto iter = un_s1.find("Rust");
    std::cout<<*iter<<std::endl;
    std::advance(iter, 1);
    std::cout<<*iter<<std::endl;
    std::advance(iter, 1);
    std::cout<<*iter<<std::endl<<std::endl;

    std::cout<<"[equal_range() test]\n";
    auto iter_equal = un_s1.equal_range("Rust");
    std::cout<<std::distance(iter_equal.first,iter_equal.second)<<"\n";

    while (iter_equal.first != iter_equal.second)
    {
    
    
        std::cout<<*iter_equal.first<<" ";
        std::advance(iter_equal.first, 1);
    }
    std::cout<<std::endl;       
    
    return 0;    
}

result

linux  golang  Rust  Rust  Rust  matlab  c  c++

count() of Rust is: 3

[find() test]
Rust
Rust
Rust

[equal_range() test]
3
Rust Rust Rust

Guess you like

Origin blog.csdn.net/shouhu010/article/details/129795469