全网营销型网站建设模板,宁波网站建设服务,外包网站建设,定制设计网站公司文章目录测试环境multiset介绍头文件模块类定义对象构造初始化元素访问元素插入和删除元素查找容器大小迭代器其他函数测试环境
系统#xff1a;ubuntu 22.04.2 LTS 64位 gcc版本#xff1a;11.3.0 编辑器#xff1a;vsCode 1.76.2
multiset介绍
关联式容器。元素是唯一的…
文章目录测试环境multiset介绍头文件模块类定义对象构造初始化元素访问元素插入和删除元素查找容器大小迭代器其他函数测试环境
系统ubuntu 22.04.2 LTS 64位 gcc版本11.3.0 编辑器vsCode 1.76.2
multiset介绍
关联式容器。元素是唯一的即是值又是键。元素不能直接修改需要先删除在插入。支持双向迭代器。在插入、删除和搜索时间复杂度为log(n)。
头文件
#include set模块类定义
template typename _Key, typename _Compare std::less_Key, typename _Alloc std::allocator_Key class multiset{};_Key表示存储的键(值)数据类型 _Compare表示按照键的排序方式。 _Alloc表示所存储分配器的类型负责元素内存的分配和释放。可选参数一般不使用。
对象构造
/*默认构造函数*关联容器和容器适配器。*/
std::multisetint multiSet1;
/*构造一个set指定排序方式*/
std::multisetint multiSet2(std::lessint());
/*拷贝构造函数*/
std::multisetint multiSet3(multiSet1);
/*移动构造函数*/
std::multisetint multiSet4(std::move(multiSet1));
/*初始化列表*/
std::multisetint multiSet5({5,4,3,2,1});
/*初始化列表排序方式*/
std::multisetint multiSet6({5,4,3,2,1}, std::lessint());
/*迭代器指定范围构造*/
std::multisetint multiSet7(multiSet6.begin(),multiSet6.end());
/*迭代器指定范围排序方式*/
std::multisetint multiSet8(multiSet7.begin(), multiSet7.end(), std::lessint());初始化
/*初始化列表初始化元素*/
multiSet1 {1,3,5,4,2};元素访问
不支持at()函数和下标运算符访问元素
元素插入和删除
函数返回值功能clear()无清空所有元素erase()迭代器或删除元素数量清除指定位置的一个元素、通过迭代器指定范围内的元素或通过键删除值emplace()迭代器直接构造一个元素并插入集合中。emplace_hint()迭代器在指定的位置插入元素。insert()键值对、迭代器、无1直接插入一个元素。2在指定位置插入1个元素。3复制通过迭代器指定范围的元素。4通过初始化列表插入元素。
multiSet1 {2,2,3,1,1,5,6,6,2};
/*直接构造并插入元素*/
std::multisetint::iterator itr1 multiSet1.emplace(10);
std::cout itr1 value is *itr1std::endl;
/*直接构造元素并插入指定位置*/
std::multisetint::iterator itr2 multiSet1.emplace_hint(multiSet1.begin(),8);
std::cout itr2 value is *(itr2)std::endl;
/*使用移动语句在指定位置插入元素*/
int iValue 10;
std::multisetint::iterator itr3 multiSet1.emplace_hint(multiSet1.begin(),iValue);
std::cout itr3 value is *(itr3)std::endl;
/*插入元素*/
std::multisetint::iterator itr4 multiSet1.insert(8);
std::cout itr4 value is *(itr4)std::endl;
/*使用移动函数插入元素,使用移动语句后iValue1不要再使用*/
int iValue1 7;
std::multisetint::iterator itr5 multiSet1.insert(std::move(iValue1));
std::cout itr5 value is *(itr5)std::endl;
/*指定位置插入元素*/
std::multisetint::iterator itr6 multiSet1.insert(multiSet1.begin(), 12);
std::cout itr6 value is *(itr6)std::endl;
/*使用移动函数在指定位置插入元素*/
int iValue2 13;
std::multisetint::iterator itr7 multiSet1.insert(--multiSet1.end(), std::move(iValue2));
std::cout itr7 value is *(itr7)std::endl;
/*使用迭代器插入元素*/
multiSet1.insert(multiSet5.begin(), --multiSet5.end());
/*使用初始化列表插入元素*/
multiSet1.insert({1,2,5,4,8,3});
/*按值删除元素*/
int iDelCnt multiSet1.erase(2);
std::cout delete value count iDelCnt std::endl;
/*删除指定位置的元素*/
std::multisetint::iterator itr8 multiSet1.erase(multiSet1.begin());
std::cout itr8 value is *(itr8)std::endl;
/*删除指定范围的元素*/
std::multisetint::iterator itr9 multiSet1.erase(multiSet1.begin(), --multiSet1.end());
std::cout itr9 value is *(itr9) std::endl;
/*清空元素*/
multiSet1.clear();元素查找
函数返回值功能count()std::size_t返回给定键对应元素的数量find()迭代器查找指定键对应元素的位置,未找到则返回end()lower_bound()迭代器查找第一个大于或等于给定键的元素的位置,未找到则返回end()upper_bound()迭代器查找第一个大于给定键的元素的位置未找到返回end()equal_range()键值对获取给定键的lower_bound和upper_bound键值对的第一个元素表示lower_bound,第二个元素表示upper_bound
multiSet1 {1,1,2,2,3,4,5,6,6,8};
/*查找指定值的数量*/
std::cout count: multiSet1.count(2) std::endl;
/*查找指定值的位置*/
std::multisetint::iterator itr10 multiSet1.find(6);
std::cout itr10 value is *(itr10) std::endl;
/*查找第一个大于等于给定键的元素的位置*/
std::multisetint::iterator itr11 multiSet1.lower_bound(3);
std::cout itr11 value is *(itr11)std::endl;
/*查找第一个大于给定键的元素的位置*/
std::multisetint::iterator itr12 multiSet1.upper_bound(6);
std::cout itr12 value is *(itr12)std::endl;
/*分别返回lower_bound和upper_bound*/
std::pairstd::multisetint::iterator, std::multisetint::iterator pair multiSet1.equal_range(1);
std::cout lower_bound value:*(pair.first)std::endl;
std::cout upper_bound value:*(pair.second)std::endl;容器大小
函数返回值功能size()std::size_t获取当前容器中的元素数量empty()bool判断当前容器是否为空为空返回true否则返回falsemax_size()std::size_t返回容器的最大容量
/*判断元素的数量*/
std::coutmultiSet1 size is multiSet1.size()std::endl;
/*判断容器最大能容纳的元素的数量*/
std::cout multiSet1 max size is : multiSet1.max_size()std::endl;
/*判断容器是否为空*/
std::cout multiSet1 is empty ? std::boolalphamultiSet1.empty()std::endl;迭代器
类型功能iterator正向访问迭代器。从前向后访问元素可以读取也可以修改const_iterator常量正向访问迭代器。从前向后访问元素只能读取不能修改reverse_iterator逆向访问迭代器。从后向前访问元素可以读取也可以修改const_reverse_iterator常量逆向访问迭代器。从后向前访问元素只能读取不能修改
函数返回值功能begin()正向访问迭代器返回指向set对象首元素所在位置的迭代器end()正向访问迭代器返回指向set对象末尾元素的下一个位置的迭代器cbegin()常量正向访问迭代器返回指向set对象首元素所在位置的常量迭代器cend()常量正向访问迭代器返回指向set对象末尾元素的下一个位置的迭代器rbegin()逆向访问迭代器返回指向set对象末尾元素位置的迭代器rend()逆向访问迭代器返回指向set对象首元素的前一个位置的迭代器crbegin()常量逆向访问迭代器返回指向set对象末尾元素位置的常量迭代器crend()常量逆向访问迭代器返回指向set对象首元素的前一个位置的常量迭代器
std::multisetint multisetTest({1,8,2,6,4,5,8,10,2,7});
/*正向随机访问迭代器并打印输出1 2 2 4 5 6 7 8 8 10*/
std::setint::iterator itr;
for (itr multisetTest.begin(); itr ! multisetTest.end(); itr)
{/* 不允许修改元素值 *///*itr 10; /* 访问元素 */std::cout*(itr) ;
}
std::coutstd::endl;
/*常量正向随机访问迭代器并打印输出1 2 2 4 5 6 7 8 8 10*/
std::setint::const_iterator cItr;
for (cItr multisetTest.cbegin(); cItr ! multisetTest.cend(); cItr)
{/* 不允许修改值编译报错 *///*cItr 10; /* 访问元素 */std::cout *(cItr) ;
}
std::coutstd::endl;
/*逆向随机访问迭代器并打印输出10 8 8 7 6 5 4 2 2 1*/
std::setint::reverse_iterator rItr;
for (rItr multisetTest.rbegin(); rItr! multisetTest.rend(); rItr)
{/* 不允许修改元素值 *///*rItr 100; /* 访问元素 */std::cout *(rItr);
}
std::coutstd::endl;/*常量逆向随机访问迭代器并打印输出10 8 8 7 6 5 4 2 2 1*/
std::setint::const_reverse_iterator crItr;
for (crItr multisetTest.crbegin(); crItr! multisetTest.crend(); crItr)
{/* 不允许修改元素值 编译报错 *///*crItr 100; /* 访问元素 */std::cout *crItr;
}
std::cout std::endl;其他函数
函数名返回值功能swap()无交换两个容器的元素
/*交互两个容器元素的值,无返回值*/
std::multisetint multisetSwap1 {1,2,3,4,3};
std::multisetint multisetSwap2 {6,7,8,6,10};
/*方式1 multisetSwap1{6,6,7,8,10}, multisetSwap2{1,2,3,3,4}*/
multisetSwap1.swap(multisetSwap2);
std::cout multisetSwap1: std::endl;
for (auto item : multisetSwap1)
{std::cout item;
}
std::cout std::endl multisetSwap2: std::endl;
for (auto item : multisetSwap2)
{std::cout item;
}
/*multisetSwap1{1,2,3,3,4}, multisetSwap2{6,6,7,8,10}*/
std::swap(multisetSwap1,multisetSwap2);
std::cout std::endl multisetSwap1: std::endl;
for (auto item : multisetSwap1)
{std::cout item;
}
std::cout std::endl multisetSwap2: std::endl;
for (auto item : multisetSwap2)
{std::cout item;
}