Day17 C++STL入门基础知识十——set、multiset容器、pair组队 基本概念-构造函数-赋值变换-大小操作-插入删除-数据存取-反转排序 【全面深度剖析+例题代码展示】

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;
}

③ 测试结果

  1. set
    在这里插入图片描述
    在这里插入图片描述
  2. 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 (^ _ ^)

如果感觉这篇文章对你有帮助的话,不妨三连支持下,十分感谢(✪ω✪)。

printf("点个赞吧*^*");
cout << "收藏一下叭o_o";
System.out.println("评论一下吧^_^");
print("关注一下叭0-0")

猜你喜欢

转载自blog.csdn.net/m0_73612212/article/details/128893217
今日推荐