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