STL容器(set)

总结

1)set 就是一个有序的集合

2)怎么定义STL容器除了string特殊,其他定义方法一样

set<typename> name;

3)访问,只能用迭代器访问

4)也有begin(),和end()+ 5个函数

  1. insert()
  2. size()
  3. find()
  4. erase()
  5. clear()

什么是set?

set就是一个集合,官方的说就是一个内部有序且不含重复元素的容器。

使用+头文件

#include<set>
using namespace std;

1,set的定义

set<typename> name;

其余写法给vector一样,大部分STL容器都是这样定义。

set<int> name;
set<char> name;
set<double> name;
set<node> name; 

定义数组

set<typename> Arrayname[arraySize];

例如

set<int> a[100];

Arrayname[0] ~ Arrayname[arraySize - 1]中的每一个都是set容器

2,set的访问

set 只能用 迭代器访问

set<typename>::iterator it;

并且可以通过 * it 来访问set里面的元素。

由于除开vector 和 string 之外的STL容器都不支持*(it + i)的访问方式,因此只能用以下方式枚举

#include<iostream>
#include<stdio.h>
#include<set> 
using namespace std;
int main(){
	set<int> st;
	st.insert(3);
	st.insert(5);
	st.insert(7);
	st.insert(2);
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		cout << *it << " ";
	}
	return 0;
}

常用函数

(1)inset()

将x插入set 容器中,并进行自动递增排序去重,时间复杂度O(logN)N为set内元素的个数。

(2)find()

find(value)返回set中对应值的value 的迭代器,时间复杂度为 O(logN)N为set内元素的个数。

#include<iostream>
#include<stdio.h>
#include<set> 
using namespace std;
int main(){
	set<int> st;
	for(int i = 1; i <= 3; i++){
		st.insert(i);
	} 
	set<int>::iterator it = st.find(2);
	cout << *(it) << endl;
	return 0;
}

如果找不到,超出set.size()的范围就会返回set.size()

(3)erase()

还是两种用法

  1. 删除单个元素(2种方法)
  • 第一种

st.erase( it ), it为所需要删除元素的迭代器,时间复杂度为O(1),可以结合find()函数来用

#include<iostream>
#include<stdio.h>
#include<set> 
using namespace std;
int main(){
	set<int> st;
	for(int i = 1; i <= 9; i++){
		st.insert(i);
	} 
	st.erase(st.find(5));
	st.erase(st.find(8));
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		cout << *it << " ";
	}
	return 0;
}
  • st.erase(value),value为所需要删除元素的值,时间复杂度为 O(logN) N为set元素的个数
#include<iostream>
#include<stdio.h>
#include<set> 
using namespace std;
int main(){
	set<int> st;
	for(int i = 1; i <= 9; i++){
		st.insert(i);
	} 
	st.erase(3);
	st.erase(7);
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		cout << *it << " ";
	}
	return 0;
}
  1. 删除一个区间内的所有元素

set.erase(first, last)可以删除一个区间内所有的元素,其中first为所需要删除区间的起始迭代器,而last 则为所需要删除区间的末尾迭代器的下一个位置地址。就是删除,[ first, last ) 时间复杂度 O(last - first)。

#include<iostream>
#include<stdio.h>
#include<set> 
using namespace std;
int main(){
	set<int> st;
	st.insert(10);
	st.insert(40);
	st.insert(20);
	st.insert(30);
	set<int>::iterator it = st.find(30);
	st.erase(it, st.end());    //st.erase(it, st.find(40))答案不一样,助于理解
	for(set<int>::iterator it = st.begin(); it != st.end(); it++){
		cout << *it << " ";
	}
	return 0;
}

set 容器不允许 it + 数字,

只有 vector和 string 允许

(4)size()

用来获取set内元素的个数,时间复杂度为O(1)

#include<iostream>
#include<stdio.h>
#include<set> 
using namespace std;
int main(){
	set<int> st;
	st.insert(10);
	st.insert(40);
	st.insert(20);
	st.insert(30);
	cout << st.size() << endl;
	return 0;
}

(5)clear()

清空所有元素时间复杂度为 O(N)

#include<iostream>
#include<stdio.h>
#include<set> 
using namespace std;
int main(){
	set<int> st;
	st.insert(10);
	st.insert(40);
	st.insert(20);
	st.insert(30);
	st.clear();
	cout << st.size() << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Harington/article/details/87866523
今日推荐