当前位置:首页 > C++知识 > 正文内容

STL入门——容器2:set

亿万年的星光4年前 (2021-12-25)C++知识2229

一、简单介绍

    

  • set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型),基本功能与数组相似。

  • set与数组不同的是,在set中每个元素的值都是唯一的。

  • 而且set插入数据时,能够根据元素的值自动进行排序。

  • set中数元素的值并不能直接被改变。


二、set底层

(1)set的底层是红黑树,是红黑树里面K的模型;

K模型:表示只能存放同一种数据类型
KV模型:表示能存放两种数据类型

(2)map的底层也是红黑树,而它是KV模型。
(3)set不允许插入重复数据,而multiset允许插入相同的数据。

三、set常用方法

begin();  	//返回set容器的第一个元素
end();  	//返回set容器的最后一个元素
clear();  	//删除set容器中的所有的元素
empty();  	//判断set容器是否为空
max_size();    //返回set容器
size(); 	//返回当前set容器中的元素个数
rbegin();   //返回的值和end()相同
rend();     //返回的值和rbegin() 相同

四、定义及使用

使用set的头文件是 #include<set>

#include<set>

定义:

set<int> a; // 定义一个int类型的集合a
set<int> b(a); // 定义并用集合a初始化集合b
set<int> b(a.begin(), a.end()); // 将集合a中的所有元素作为集合b的初始值

数据录入的方式通过for循环:

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> ss;
	//可以通过下面的方式进行输入 
	for(int i=0;i<5;i++){
		ss.insert(i);
		//或者像下面这样 
	//	int x;
	//	cin>>x;
	//	ss.insert(x); 
	}
}

数据的输出有点麻烦,需要一点指针的知识

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> ss;
	//可以通过下面的方式进行输入 
	for(int i=0;i<5;i++){
		ss.insert(i);
		//或者像下面这样 
	//	int x;
	//	cin>>x;
	//	ss.insert(x); 
	}
	//数据输出
	set<int>::iterator it = ss.begin();
	for(it =ss.begin(); it!=ss.end();it++){
		cout<<*it<<" ";// 输出  0 1 2 3 4 
	} 
	cout<<endl;
	return 0; 
}

五、其他函数的使用

1.大小、容量、个数

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> ss;
	//可以通过下面的方式进行输入 
	for(int i=0;i<5;i++){
		ss.insert(i);
		//或者像下面这样 
	//	int x;
	//	cin>>x;
	//	ss.insert(x); 
	}
	cout << ss.size() << endl; // 输出:5
	cout << ss.max_size() << endl; // 输出:461168601842738790
	cout << ss.count(2) << endl; // 输出:1
	return 0; 
}


2、删除函数

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> ss;
	//可以通过下面的方式进行输入 
	for(int i=0;i<5;i++){
		ss.insert(i);
		//或者像下面这样 
	//	int x;
	//	cin>>x;
	//	ss.insert(x); 
	}
	ss.erase(4); // 删除容器中值为elem的元素
	set<int>::iterator it = ss.begin();
	ss.erase(it);
	ss.erase(st.begin(), ++st.begin()); 	// 删除[first,last]之间的元素
	ss.clear(); //清空所有元素
	return 0; 
}

3、访问与查找

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> ss;
	//可以通过下面的方式进行输入 
	for(int i=0;i<5;i++){
		ss.insert(i);
		//或者像下面这样 
	//	int x;
	//	cin>>x;
	//	ss.insert(x); 
	}
	// 通过find(key)查找键值
	set<int>::iterator it;
	it = ss.find(2);
	cout << *it << endl; // 输出:2
	return 0; 
}

4、交换两个容器元素

#include<iostream>
#include<set>
using namespace std;
int main(){
	set<int> st1;
	st1.insert(1);
	st1.insert(2);
	st1.insert(3);
	set<int> st2;
	st2.insert(4);
	st2.insert(5);
	st2.insert(6);
	// 交换两个容器的元素
	st1.swap(st2);

	// 遍历显示
	cout << "交换后的st1: ";
	set<int>::iterator it;
	for (it = st1.begin(); it != st1.end(); it++)
		cout << *it << " "; // 输出:4 5 6
	cout << endl;
	// 遍历显示
	cout << "交换后的st2: ";
	for (it = st2.begin(); it != st2.end(); it++)
		cout << *it << " "; // 输出:1 2 3
	cout << endl;

	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【算法】分治算法

前言所谓分治算法就是指分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小问题的求解达到对整个问题的求解。当我们将问题分解成两个较小问题求解时的分治方法称为二分法。比如,我们玩过最简单的猜...

【数论】常见的距离度量方法

【数论】常见的距离度量方法

一、欧式距离欧式距离(Eucliden Metric,也是欧几里得度量)是一个通常采用的距离定义,旨在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点距离)。在二维和三维空间中的欧氏距...

01背包问题

问题定义01背包问题是一个经典的组合优化问题,通常描述如下:有个容量为C的背包有n件物品,第i件物品的重量为Wi,价值为Vi每种物品只有一件,可以选择放入背包(1)或不放入背包(0),因此称为“01”...

【数据结构】栈的基本操作

0.前言上一篇中简单介绍了栈的定义,这一篇中介绍栈的基本用法,包含压栈,出栈,判断栈空,判断栈中元素个数等。下面进行详细介绍1.基本用法本文介绍的栈的主要操作,使用栈之前加入<stack>...

如何估算时间复杂度

首先:  常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!)时间复杂度可以简单理解为最多执...

C++中的宏

一、预处理和编译器    首先,预编译器就是在编译器之前运行,换句话说,预编译器根据程序员的指示,决定实际要编译的内容。预编译器编译指令都以 # 开头。例如:1...