文章目录
1. set
1.1 特点
- set容器插入时容器的所有元素都会自动排序【自动排序】
- set容器不允许插入重复的值【自动去重】
1.2 构造与赋值
① 函数原型
- 构造
set<T> st;
默认构造函数set(const set &st);
拷贝构造函数
- 赋值
set& operator=(const set &st);
重载等号操作符
② 函数原型
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
using namespace std;
void printSet(const set<int>& s) {
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {
cout << (*it) << " ";
} cout << endl;
}
void text01() {
set<int> s1;
//insert插入
s1.insert(10);
s1.insert(30);
s1.insert(40);
s1.insert(20);
s1.insert(30);
//遍历容器
printSet(s1);
//拷贝构造
set<int> s2(s1);
printSet(s2);
//赋值操作
set<int> s3;
s3 = s2;
printSet(s3);
}
int main() {
text01();
return 0;
}
代码展示
1.3 大小交换
① 函数原型
size();
返回容器中元素的数目empty();
判空swap(st);
交换两个集合容器
② 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
using namespace std;
void printSet(const set<int>& s) {
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {
cout << (*it) << " ";
} cout << endl;
cout << "------------------------------------------------" << endl;
}
void text02() {
set<int> s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
printSet(s1);
//判空
if (s1.empty()) cout << "容器为空" << endl;
else cout << "容器不为空" << endl;
//大小
cout << "大小为: " << s1.size() << endl;
//交换
set<int> s2;
for (int i = 0; i < 10; i++) {
s2.insert(i);
}
cout << "s1为: "; printSet(s1);
cout << "s2为: "; printSet(s2);
swap(s1, s2);
cout << "s1为: "; printSet(s1);
cout << "s2为: "; printSet(s2);
}
int main() {
//text01();
text02();
return 0;
}
③ 测试结果
1.4 插入删除
① 函数原型
insert(elem);
插入元素clear();
清楚元素erase(pos);
删除pos迭代器所指的元素,返回下一个元素的迭代器erase(beg, end);
删除区间[beg, end)的所有元素,返回下一个元素的迭代器erase(elem);
删除容器中值为elem的元素
② 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
using namespace std;
void printSet(const set<int>& s) {
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {
cout << (*it) << " ";
} cout << endl;
cout << "------------------------------------------------" << endl;
}
void text03() {
set<int> s1;
//插入元素
s1.insert(30);
s1.insert(10);
s1.insert(20);
s1.insert(40);
printSet(s1);
set<int>s2(s1);
//删除
s1.erase(s1.begin());
printSet(s1);
s1.erase(30);
printSet(s1);
//清空
s1.erase(s1.begin(), s1.end());
printSet(s1);
s2.clear();
printSet(s2);
}
int main() {
//text01();
//text02();
text03();
return 0;
}
③ 测试结果
1.5 查找和统计
① 函数原型
find(key);
查找key是否存在- 若存在,返回该键的迭代器
- 否则,返回set.end()
count(key);
统计key的个数
② 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
using namespace std;
void printSet(const set<int>& s) {
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {
cout << (*it) << " ";
} cout << endl;
cout << "------------------------------------------------" << endl;
}
void text04() {
set<int> s1;
s1.insert(40);
s1.insert(30);
s1.insert(20);
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
s1.insert(30);
//查找
set<int>::iterator pos = s1.find(30);
if (pos != s1.end()) cout << "找到该元素" << endl;
else cout << "未找到该元素" << endl;
//统计【自动去重后,统计结果为0/1】
int cnt = s1.count(30);
cout << "30的个数为: " << cnt << endl;
}
int main() {
//text01();
//text02();
//text03();
text04();
return 0;
}
③ 测试结果
1.6 排序规则
Ⅰ. 内置数据类型排序
① 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
using namespace std;
void printSet(const set<int>& s) {
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {
cout << (*it) << " ";
} cout << endl;
cout << "------------------------------------------------" << endl;
}
class MyCompare {
public:
bool operator()(int x, int y) const {
// 第一个()表示重载的符号,第二个()表示重载函数的参数列表
return x > y; //由大到小排的仿函数,返回类型为bool类型
}
};
void text07() {
set<int> s1;
s1.insert(60);
s1.insert(30);
s1.insert(80);
s1.insert(50);
s1.insert(10);
s1.insert(20);
//默认从小到大排
printSet(s1);
//利用仿函数从大到小排
set<int, MyCompare> s2;
s2.insert(60);
s2.insert(30);
s2.insert(80);
s2.insert(50);
s2.insert(10);
s2.insert(20);
for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
cout << (*it) << " ";
} cout << endl;
}
int main(){
text08();
return 0;
}
非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);容器这边大部分类似,听着有点枯燥。但不加const的成员函数只能被非const对象调用。
② 测试结果
Ⅱ. 自定义数据类型排序
① 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
using namespace std;
class Player {
public:
Player(string name, int age) {
this->m_name = name;
this->m_age = age;
}
public:
string m_name;
int m_age;
};
class cmp {
public:
bool operator()(const Player& p1, const Player& p2) const{
return p1.m_age > p2.m_age; //按年龄降序排
}
};
void text08() {
set<Player, cmp> s;
Player p1("詹姆斯", 38);
Player p2("杜兰特", 34);
Player p3("戴维斯", 33);
Player p4("利拉德", 35);
Player p5("东契奇", 25);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
s.insert(p5);
for (set<Player, cmp>::iterator it = s.begin(); it != s.end(); it++) {
cout << (*it).m_name << " " << (*it).m_age << endl;
}
//set默认从小到大排,自定义数据类型无法确定按什么类进行排序
}
int main(){
text08();
return 0;
}
②测试结果
2. multiset与set区别
① 区别
- set不可以插入重复数据,而multiset可以
- set插入数据的同时会返回插入结果,表示插入是否成功
② 代码测试
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
using namespace std;
void printSet(const set<int>& s) {
for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {
cout << (*it) << " ";
} cout << endl;
cout << "------------------------------------------------" << endl;
}
void text06() {
multiset<int> ms;
ms.insert(10);
ms.insert(10);
for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) {
cout << (*it) << " ";
}
cout << endl;
}
void text05() {
set<int> s;
s.insert(10);
s.insert(10);
printSet(s);
pair< set<int>::iterator, bool > ret = s.insert(10);
//pair相当于返回两个数据类型的函数,一个是迭代器,一个是布尔类型
if (ret.second) // .second 就是第二个布尔的返回类型
cout << "第一次插入成功" << endl;
else
cout << "第一次插入失败" << endl;
}
int main() {
//text01();
//text02();
//text03();
//text04();
text05();
text06();
return 0;
}
③ 测试结果
- set
- multiset
3. pair队组创建
3.1 函数原型
pair<type, type> p (value1, value2);
pair<type, type> p = make_pair (value1, value2);
3.2 代码展示
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
void text01() {
//第一种——使用"点"运算符进行操作
pair<string, int> p("James", 38);
cout << "姓名: " << p.first << " 年龄: " << p.second << endl;
//第二种——用make_pair()创造队组
pair<string, int> p2 = make_pair("Curry", 34);
cout << "姓名: " << p2.first << " 年龄: " << p2.second << endl;
}
int main() {
text01();
return 0;
}
3.3 测试结果
最后,感谢大家支持u (^ _ ^)
如果感觉这篇文章对你有帮助的话,不妨三连支持下,十分感谢(✪ω✪)。
扫描二维码关注公众号,回复: 14711033 查看本文章
printf("点个赞吧*^*");
cout << "收藏一下叭o_o";
System.out.println("评论一下吧^_^");
print("关注一下叭0-0")