59 C++ set 容器

本文详细介绍了C++标准库中的set数据结构,包括set的构造、大小、插入删除、查找、多集、对组比较及自定义排序等内容,并通过实例演示了如何使用set进行数据操作和管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set.h

#pragma once
#include<iostream>
#include<string>
#include<set>
using namespace std;

void set_construction();
void set_size();
void set_insert_del();
void set_find_count();
void set_multiset();
void set_pair();
void set_compare();
void set_compare_case();

 set.cpp

#include"set_exercise.h"

// set 载入
set<int> input_set(set<int>& obj,int num)
{
	for (int i = 0; i < num; i++)
	{
		obj.insert(i);// 插入数值
	}
	return obj;
}

// set 读取
void print_set(set<int>& obj)
{
	for (set<int>::iterator i = obj.begin(); i != obj.end(); i++)
	{
		cout << *i << ",";
	}
	cout << endl;
}

// 构造函数
void set_construction()
{
	// 构造函数
	set<int> set_01;
	set_01 = input_set(set_01, 10);
	print_set(set_01);

	// 拷贝构造函数
	set<int> set_02(set_01);
	print_set(set_02);

	// 赋值
	set<int> set_03;
	set_03 = set_02;
	print_set(set_03);
}


// set 大小
void set_size()
{
	set<int> set_01;
	set_01 = input_set(set_01, 10);
	print_set(set_01);

	cout << "Set里有" << set_01.size()<<"个元素" << endl;
	if (set_01.empty())
	{
		cout << "set_01为空。" << endl;
	}
	else
	{
		cout << "set_01不为空。" << endl;
	}

	// 交换set
	set<int> set_02;
	set_02 = input_set(set_02, 5);

	cout << "交换前:" << endl;
	print_set(set_01);//0,1,2,3,4,5,6,7,8,9,
	print_set(set_02);//0,1,2,3,4,
	// 执行交换
	set_01.swap(set_02);
	cout << "交换后:" << endl;
	print_set(set_01);//0,1,2,3,4,
	print_set(set_02);//0,1,2,3,4,5,6,7,8,9,
}

// 插入和删除
void set_insert_del()
{
	set<int> set_01;

	// 插入
	set_01.insert(10);
	set_01.insert(20);
	set_01.insert(30);
	set_01.insert(40);
	set_01.insert(50);
	set_01.insert(60);
	set_01.insert(70);
	set_01.insert(80);
	set_01.insert(90);
	set_01.insert(100);
	set_01.insert(110);
	set_01.insert(120);
	set_01.insert(130);
	set_01.insert(140);
	print_set(set_01);//10,20,30,40,50,60,70,80,90,100,110,120,130,140,

	// 删除
	set_01.erase(set_01.begin());// 删除首位元素//20,30,40,50,60,70,80,90,100,110,120,130,140,
	set_01.erase(30);// 删除指定数值//20,40,50,60,70,80,90,100,110,120,130,140,
	print_set(set_01);//

	// 删除下标3位置的数值
	set<int>::iterator it = set_01.begin();
	for (int i = 0; i < 3; i++)// 偏移值为3
	{
		it++;
	}
	set_01.erase(it);// 删除下标3位置的数值
	print_set(set_01);// 20,40,50,70,80,90,100,110,120,130,140,
	
	// 删除下标0-2位置的数据
	for (int i = 0; i < 3; i++) 
	{
		set_01.erase(set_01.begin());
	}
	print_set(set_01);// 70,80,90,100,110,120,130,140,


	// 删除指定区域段的元素
	// 获取头部指针
	set<int>::iterator it_01 = set_01.begin();
	for (int i = 0; i < 1; i++)// 偏移值为1
	{
		it_01++;
	}
	// 获取尾部指针
	set<int>::iterator it_02 = set_01.begin();
	for (int i = 0; i < 4; i++)// 偏移值为4
	{
		it_02++;
	}

	// 删除下标1-3区间的值
	set_01.erase(it_01, it_02);//
	print_set(set_01);//70,110,120,130,140,

	// 清空
	//set_01.erase(set_01.begin(), set_01.end());
	set_01.clear();//清空
	print_set(set_01);
	
}


// 查找和统计
void set_find_count()
{
	set<int> set_01;
	set_01 = input_set(set_01, 10);
	print_set(set_01);

	// 查找
	set<int>::iterator pos = set_01.find(30); 
	//cout << *pos << endl;// 如果找不到,会返回end()
	if (pos != set_01.end())
	{
		cout << "找到了元素。" << endl;
	}
	else
	{
		cout << "没找到元素。" << endl;
	}

	// 统计
	int num = set_01.count(3);// 统计set中有多少个值为 3 的元素,对于set而然只有两个结果,0或1,对于multiset意义比较大
	cout << "统计:" << num<< endl;//1

}

// set和multiset
void set_multiset()
{
	multiset<int> mset;

	for (int i = 0; i < 10; i++)
	{
		mset.insert(i);//插入
	}

	mset.insert(2);// 插入2

	for (multiset<int>::iterator i = mset.begin(); i != mset.end(); i++)
	{
		cout << *i << ",";//0,1,2,2,3,4,5,6,7,8,9,
	}
	cout << endl;
}

// 创建对组
void set_pair()
{
	pair<string, int>p("Max", 30);
	cout << "姓名:" << p.first << "年龄:" << p.second << endl;//

	pair<string, int>p2 = make_pair("Song", 21);
	cout << p2.first << p2.second << endl;
}

// set自定义排序从大到小
class MyCompare
{
public:
	// 仿函数,设计为从大到小
	bool operator()( int a, int b)const
	{
		return a > b;
	}
};

// 自定义set排序
void set_compare()
{
	set<int> s1;
	s1.insert(10);
	s1.insert(50);
	s1.insert(30);
	s1.insert(20);
	s1.insert(40);
	print_set(s1);// 10,20,30,40,50,(默认从小到大排序)
	cout << endl;

	// 用仿函数指定排序规则
	set<int,MyCompare> s2;
	s2.insert(10);
	s2.insert(50);
	s2.insert(30);
	s2.insert(20);
	s2.insert(40);
	for (set<int,MyCompare>::iterator i = s2.begin(); i != s2.end(); i++)
	{
		cout << *i << ",";// 50,40,30,20,10,
	}
	cout << endl;
}


// set排序案例
class PersonA
{
public:
	PersonA(string name,int age)
	{
		this->name = name;
		this->age = age;
	}
	
	string name;
	int age;

};

class ComparePerson
{
public:
	bool operator()( PersonA p1, PersonA p2)const
	{
		return p1.age > p2.age;
	}
};

void set_compare_case()
{
	set<PersonA, ComparePerson> s1;

	PersonA p1("刘备",43);
	PersonA p2("诸葛亮",26);
	PersonA p3("关羽",38);
	PersonA p4("张飞",37);
	PersonA p5("赵云",30);
	PersonA p6("马超",26);
	PersonA p7("黄忠",61);

	s1.insert(p1);
	s1.insert(p2);
	s1.insert(p3);
	s1.insert(p4);
	s1.insert(p5);
	s1.insert(p6);
	s1.insert(p7);
	// 年龄从大到小排序
	for (set<PersonA,ComparePerson>::iterator i = s1.begin(); i != s1.end(); i++)
	{
		cout << "姓名:" << i->name << "  年龄:" << i->age << endl;
	}
	cout << endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值