目录
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容器重新排列,使得原有的顺序被打乱