在C++ STL中设置

时间:2020-02-23 14:30:03  来源:igfitidea点击:

标准模板库(STL)包含内置的数据结构,在实现复杂算法时会派上用场。
这些容器之一是"集合"。

C++中集合的属性

让我们先介绍C++集的一些基本属性,然后再介绍其实现。

  • 唯一性– C++集内的所有元素都是唯一的。

  • 已排序–集合中的元素始终是已排序的方式。

  • 不可变–集合内的任何元素都无法更改。
    它只能被插入或者删除。

  • 未索引-STL集不支持索引。

  • 内部实现– STL中的集合由BST(二进制搜索树)在内部实现。

用C++初始化集合

Set的初始化涉及定义要存储的元素的数据类型以及存储它们的顺序。

#include<iostream>
#include<set>
/*
Or

#include<bits/stdc++.h>
*/
using namespace std;

int main(){

	//Empty Set - Increasing Order (Default)
	set<int> s1;
	//s1 = {}

	//Empty Set - Decreasing Order
	set<int, greater<int>> s2;
	//s2 = {} 

	//Set with values
	set<int, greater<int>> s3 = {6, 10, 5, 1};
	//s3 = {10, 6, 5, 1}

	//Initialize Set using other set
	set<int, greater<int>> s4(s3);
	//s4 = {10, 6, 5, 1} 

	//Initializing a set from array
	int arr[] = {10, 4, 5, 61};
	set<int> s5(arr, arr+2);  //Only two elements 
	//s5 = {4, 10}

	return 1;
}

上面的代码段说明了初始化STL集的方法。

在C++中遍历集合

C++具有用于每个特定STL数据结构的迭代器的概念。
由于Set不支持索引,因此我们需要定义迭代器以获取其元素。

#include<iostream>
#include<set>

using namespace std;

int main(){

	//Set with values
	set<int, greater<int>> s1 = {6, 10, 5, 1};
	
	//Iterator for the set
	set<int> :: iterator it;

	//Print the elements of the set
	for(it=s1.begin(); it != s1.end();it++)
		cout<<*it<<" ";
	cout<<endl;
}

输出:

10 6 5 1 

这里要注意的几件事是:

  • ''begin()'`-此函数将迭代器返回到第一个元素。

  • 'end()'–此函数返回最后一个元素之后的迭代器。

  • '* it'–存放在位置迭代器中的值。

向集合添加元素

将元素添加到集合中的琐碎任务是通过insert()函数完成的。
该函数采用与集合中元素相同的值。

#include<iostream>
#include<set>

using namespace std;

int main(){

	//Set with values
	set<int, greater<int>> s1 = {6, 10, 5, 1};
	//s1 = {10, 6, 5, 1}

	//Inserting elements in the set
	s1.insert(12);
	s1.insert(20);
	s1.insert(3);

	//Iterator for the set
	set<int> :: iterator it;

	//Print the elements of the set
	for(it=s1.begin(); it != s1.end();it++)
		cout<<*it<<" ";
	cout<<endl;

}

输出:

20 12 10 6 5 3 1 

要记住的一件事是,添加的元素是根据创建集合时定义的排列来放置的。
因此,将元素插入集合的时间复杂度为O(logN),其中N是集合的大小。

集合的大小可以通过'size()'函数来获取。

从集合中删除元素

STL集支持erase()函数,该函数可以将值或者迭代器带到要从集中删除的值。

#include<iostream>
#include<set>

using namespace std;

int main(){

	//Set with values
	set<int, greater<int>> s1 = {6, 10, 5, 1};
	//s1 = {10, 6, 5, 1}

	//Erasing element value = 1
	s1.erase(1);
	//s1 = {10, 6, 5}

	//Erasing the first element
	s1.erase(s1.begin());
	//s1 = {6, 5}

	//Iterator for the set
	set<int> :: iterator it;

	//Print the elements of the set
	for(it=s1.begin(); it != s1.end();it++)
		cout<<*it<<" ";
	cout<<endl;

}

输出:

6 5 

如果集合中不存在要删除的元素,则C++代码不会提示错误。
如果传递了无效的迭代器,则会引发运行时错误。

insert()函数类似,erase()函数花费O(logN)时间删除元素。

搜索集合中的元素

有一个预定义的函数" find()",用于在集合中搜索元素。
如果存在,则该函数将迭代器返回到该值,否则返回最后一个元素(" end()")之后的迭代器。

#include<iostream>
#include<set>

using namespace std;

int main(){

	//Set with values
	set<int, greater<int>> s1 = {6, 10, 5, 1};
	//s1 = {10, 6, 5, 1}

	//The value to be searched
	int val = 5;

	//Check if the iterator returned is not the ending of set
	if(s1.find(val) != s1.end())
		cout<<"The set contains "<<val<<endl; 
	else
		cout<<"The set does not contains "<<val<<endl; 

	//The value to be searched
	val = 11;

	//Check if the iterator returned is not the ending of set
	if(s1.find(val) != s1.end())
		cout<<"The set contains "<<val<<endl; 
	else
		cout<<"The set does not contains "<<val<<endl; 	

}

输出:

The set contains 5
The set does not contains 11

该代码是不言自明的,因为它根据值的存在或者不存在来打印消息。

其他常用设定功能

以下是一些使用STL Set时可能会派上用场的Set函数。

  • size()–返回集合的大小

  • empty()–如果Set为空,则返回true,否则返回false。

  • rbegin()-返回指向Set的最后一个元素的反向迭代器。

  • rend()–返回指向Set的第一个元素之前的反向迭代器。

  • clear()–清空整个Set。

  • count(value)–如果集合中存在" value",则返回1,否则返回0。

  • swap(set1,set2)–交换两个集合的内容。

  • emplace(value)-将"值"插入到集合中(如果不存在)。