Set和multiset容器中常用函数的使用

目录

Set和multiset容器的使用

Set不接受重复元素

代码示例

运行结果

动态分配空间函数get_allocator()函数

代码示例

运行结果

代码示例

结果显示

查看能申请到的最大空间函数max_size()函数

代码示例

结果显示

返回第一个或者最后一个指定元素

代码示例

结果显示

Key_comp()与value_comp()函数的区别

代码示例

元素个数查询函数count()

寻找相同元素段函数equal_range()

功能简介

代码示例

自定义排序方式

set容器中find()函数的使用


Set和multiset容器的使用

Set不接受重复元素

代码示例

// unorder_set和unorder_multiset的使用.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。  
//  
  
#include <iostream>  
#include <unordered_set>  
#include <set>  
using namespace std;  
  
int main()  
{  
    set<int> SetArray{ 1,2,3,3,3,4,5 };  
}  

 

运行结果

 

动态分配空间函数get_allocator()函数

代码示例

#include <iostream>  
#include <set>  
using namespace std;  
  
int main()  
{  
    set<int> SetArray{ 1,2,3,4,5 };  
    int *pointer1 = SetArray.get_allocator().allocate(5);  
    pointer1[0] = 0;  
    pointer1[1] = 1;  
    pointer1[2] = 2;  
    pointer1[3] = 3;  
    pointer1[4] = 4;  
}  

 

运行结果

 

代码示例

#include <iostream>  
#include <set>  
using namespace std;  
  
int main()  
{  
    set<int> SetArray;  
    int *pointer1 = SetArray.get_allocator().allocate(5);  
    pointer1[0] = 0;  
    pointer1[1] = 1;  
    pointer1[2] = 2;  
    pointer1[3] = 3;  
    pointer1[4] = 4;  
    SetArray.get_allocator().deallocate(pointer1,5);  
    // 参数为"指针名称"与"动态申请空间的数量"  
}  

 

结果显示

 

查看能申请到的最大空间函数max_size()函数

代码示例

#include <iostream>  
#include <set>  
using namespace std;  
  
int main()  
{  
    set<int> SetArray;  
    int *pointer1 = SetArray.get_allocator().allocate(5);  
    pointer1[0] = 0;  
    pointer1[1] = 1;  
    pointer1[2] = 2;  
    pointer1[3] = 3;  
    pointer1[4] = 4;  
    SetArray.get_allocator().deallocate(pointer1,5);  
    // 参数为"指针名称"与"动态申请空间的数量"  
  
    cout << SetArray.max_size() << endl;  
}  

 

 

结果显示

 

返回第一个或者最后一个指定元素

代码示例

#include <iostream>  
#include <set>  
using namespace std;  
  
int main()  
{  
    set<int> SetArray;  
    int *pointer1 = SetArray.get_allocator().allocate(5);  
    pointer1[0] = 0;  
    pointer1[1] = 1;  
    pointer1[2] = 2;  
    pointer1[3] = 3;  
    pointer1[4] = 4;  
    SetArray.get_allocator().deallocate(pointer1,5);  
    // 参数为"指针名称"与"动态申请空间的数量"  
  
    cout << SetArray.max_size() << endl;  
  
    multiset<int> SetArray1{ 10,20,20,30,40,40,80 };  
    multiset<int>::iterator itor1 = SetArray1.upper_bound(20);  
    multiset<int>::iterator itor2 = SetArray1.lower_bound(40);  
    SetArray1.erase(itor1, itor2);  
}  

 

 

结果显示

 

Key_comp()与value_comp()函数的区别

其实这两个函数的返回值就相当于一个函数句柄,compare函数的别名。

两者本质上都用于比较无太大差异,具体如下:

value_comp()--返回一个用于比较元素间的值的函数

key_comp()--返回一个用于元素间值比较的函数

为何两者等价,官方给出答案:

在集合容器中,对元素进行排序的键就是值本身,因此key comp和它的兄弟成员函数value comp是等价的。 

代码示例

#include <iostream>  
#include <set>  
using namespace std;  
  
int main()  
{  
    set<int> SetArray;  
    int *pointer1 = SetArray.get_allocator().allocate(5);  
    pointer1[0] = 0;  
    pointer1[1] = 1;  
    pointer1[2] = 2;  
    pointer1[3] = 3;  
    pointer1[4] = 4;  
    SetArray.get_allocator().deallocate(pointer1,5);  
    // 参数为"指针名称"与"动态申请空间的数量"  
  
    cout << SetArray.max_size() << endl;  
  
    multiset<int> SetArray1{ 10,20,20,30,40,40,80 };  
    multiset<int>::iterator itor1 = SetArray1.upper_bound(20);  
    multiset<int>::iterator itor2 = SetArray1.lower_bound(40);  
    SetArray1.erase(itor1, itor2);  
  
    multiset<int>::key_compare compare = SetArray1.key_comp(); // 默认排序为递增排列  
    itor1 = --SetArray1.end(); // 最有一个元素80为最大值  
    itor2 = SetArray1.begin();  
    bool is_less = compare(*itor2, *itor1);  
    cout << is_less << endl; // 1   
    multiset<int>::value_compare compare1 = SetArray1.value_comp(); // 默认排序为递增排序  
    is_less = compare1(*itor1, *itor1);  
    cout << is_less << endl; // 1  
}  

 

元素个数查询函数count()

#include <iostream>  
#include <set>  
using namespace std;  
  
int main()  
{  
    set<int> SetArray;  
    int *pointer1 = SetArray.get_allocator().allocate(5);  
    pointer1[0] = 0;  
    pointer1[1] = 1;  
    pointer1[2] = 2;  
    pointer1[3] = 3;  
    pointer1[4] = 4;  
    SetArray.get_allocator().deallocate(pointer1,5);  
    // 参数为"指针名称"与"动态申请空间的数量"  
  
    cout << SetArray.max_size() << endl;  
  
    multiset<int> SetArray1{ 10,20,20,30,40,40,80 };  
    multiset<int>::iterator itor1 = SetArray1.upper_bound(20);  
    multiset<int>::iterator itor2 = SetArray1.lower_bound(40);  
    SetArray1.erase(itor1, itor2);  
  
    multiset<int>::key_compare compare = SetArray1.key_comp(); // 默认排序为递增排列  
    itor1 = --SetArray1.end(); // 最有一个元素80为最大值  
    itor2 = SetArray1.begin();  
    bool is_less = compare(*itor2, *itor1);  
    cout << is_less << endl; // 1   
    multiset<int>::value_compare compare1 = SetArray1.value_comp(); // 默认排序为递增排序  
    is_less = compare1(*itor1, *itor1);  
    cout << is_less << endl; // 1  
  
    cout << "该元素有" << SetArray1.count(20) << "个" << endl;  
}  

 

寻找相同元素段函数equal_range()

功能简介

“equal_range()返回std::pair对象,其first和second成员都成为迭代器,且分别指向输入序列中所有值等于 val 的元素所组成的子序列的起始及末尾(即最后一个元素之后的位置)位置。”

如果set容器内并未含“与value等同”的任何元素,以上叙述仍然合理,这种情况下,"与value等同"的所有元素形成的,其实是一个空区间,在不破坏次序的情况下,只有一个位置可以插入value,而equal_range所返回的pair,其first和second(都是迭代器)皆指向该位置。

代码示例

#include <iostream>  
#include <set>  
using namespace std;  
  
int main()  
{  
    set<int> SetArray;  
    int *pointer1 = SetArray.get_allocator().allocate(5);  
    pointer1[0] = 0;  
    pointer1[1] = 1;  
    pointer1[2] = 2;  
    pointer1[3] = 3;  
    pointer1[4] = 4;  
    SetArray.get_allocator().deallocate(pointer1, 5);  
    // 参数为"指针名称"与"动态申请空间的数量"  
  
    cout << SetArray.max_size() << endl;  
  
    multiset<int> SetArray1{ 10,20,20,30,40,40,80 };  
    multiset<int>::iterator itor1 = SetArray1.upper_bound(20);  
    multiset<int>::iterator itor2 = SetArray1.lower_bound(40);  
    SetArray1.erase(itor1, itor2);  
  
    multiset<int>::key_compare compare = SetArray1.key_comp(); // 默认排序为递增排列  
    itor1 = --SetArray1.end(); // 最有一个元素80为最大值  
    itor2 = SetArray1.begin();  
    bool is_less = compare(*itor2, *itor1);  
    cout << is_less << endl; // 1   
    multiset<int>::value_compare compare1 = SetArray1.value_comp(); // 默认排序为递增排序  
    is_less = compare1(*itor1, *itor1);  
    cout << is_less << endl; // 1  
  
    cout << "该元素有" << SetArray1.count(20) << "个" << endl;  
  
    multiset<int> SetArray2{ 10,20,20,20,30,40,80 };  
    pair<multiset<int>::iterator, multiset<int>::iterator> range = SetArray2.equal_range(20);  
    cout << "upper_bound = " << *itor1 << endl;  
    cout << "lower_bound = " << *itor2 << endl;  
}  

 

自定义排序方式

#include <iostream>  
#include <set>  
using namespace std;  
  
struct DescendOrder   
{  
    bool operator()(const int &var1, const int &var2)  // ()代表了默认排序形式
    {  
        return var1 > var2;  
    }  
};  
  
int main()  
{  
    set<int> SetArray;  
    int *pointer1 = SetArray.get_allocator().allocate(5);  
    pointer1[0] = 0;  
    pointer1[1] = 1;  
    pointer1[2] = 2;  
    pointer1[3] = 3;  
    pointer1[4] = 4;  
    SetArray.get_allocator().deallocate(pointer1, 5);  
    // 参数为"指针名称"与"动态申请空间的数量"  
  
    cout << SetArray.max_size() << endl;  
  
    multiset<int> SetArray1{ 10,20,20,30,40,40,80 };  
    multiset<int>::iterator itor1 = SetArray1.upper_bound(20);  
    multiset<int>::iterator itor2 = SetArray1.lower_bound(40);  
    SetArray1.erase(itor1, itor2);  
  
    multiset<int>::key_compare compare = SetArray1.key_comp(); // 默认排序为递增排列  
    itor1 = --SetArray1.end(); // 最有一个元素80为最大值  
    itor2 = SetArray1.begin();  
    bool is_less = compare(*itor2, *itor1);  
    cout << is_less << endl; // 1   
    multiset<int>::value_compare compare1 = SetArray1.value_comp(); // 默认排序为递增排序  
    is_less = compare1(*itor1, *itor1);  
    cout << is_less << endl; // 1  
  
    cout << "该元素有" << SetArray1.count(20) << "个" << endl;  
  
    multiset<int> SetArray2{ 10,20,20,20,30,40,80 };  
    pair<multiset<int>::iterator, multiset<int>::iterator> range = SetArray2.equal_range(20);  
    cout << "upper_bound = " << *itor1 << endl;  
    cout << "lower_bound = " << *itor2 << endl;  
  
    set<int, DescendOrder> SetArray3{ 1,3,80,10 }; // 内部自动排序  
// 第二个参数一定为结构体类型
}  

set容器中find()函数的使用

	set<int, DescendOrder>::iterator itor3 = find(SetArray3.begin(), SetArray3.end(), 80);
	// 切记:不可以通过跌打器修改对应元素的值,因为这会导致set容器重新排列,使得原有的顺序被打乱

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥胖胖是太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值