C++ Set和multSet

本文详细介绍了C++ STL中的Set容器,包括其概念、内部实现为红黑树、基本操作及自定义比较函数等内容,并提供了实例代码。

最近发现C++ STL  Set 容器是个好东东,所以学习了一下

以下博客内容转自:http://blog.sina.com.cn/s/blog_779cf3410101389s.html

有些地方自己稍微补充了一下

1       set的含义

        set是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 setmultiset的区别是:set插入的元素不能相同,但是multiset可以相同。

 创建 multiset<ss>base;

 删除:如果删除元素a,那么在定义的比较关系下和a相等的所有元素都会被删除

 base.count(a ):set能返回0或者1,multiset是有多少个返回多少个.

 Set和multiset都是引用<set>头文件,复杂度都是logn

2       set的本质

   set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。
平衡二叉检索树使用中序遍历算法,检索效率高于vectordequelist等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
构造set集合主要目的是为了快速检索,不可直接去修改键值

3 Set中的元素可以是任意类型的

 但是由于需要排序,所以元素必须有一个序,即大小的比较关系,比如 整数可以用<比较.

4 自定义比较函数

 include<set>

 typedef struct

 {定义类型 }

 ss(类型名);

 struct cmp

 {

 bool operator()( const int&a, const int &b ) const

 {定义比较关系<}

 };

 (运算符重载,重载<)

 set<ss> base; (创建一个元素类型是ss,名字是base的set )

 注:定义了<,==和>以及>=,<=就都确定了,STL的比较关系都是用<来确定的,所以必须通 过定义< --“严格弱小于”来确定比较关

5 set的基本操作

begin() 返回指向第一个元素的迭代器

clear() 清除所有元素

count() 返回某个值元素的个数

empty() 如果集合为空,返回true

end() 返回指向最后一个元素的迭代器

equal_range() 返回集合中与给定值相等的上下限的两个迭代器

erase() 删除集合中的元素

find() 返回一个指向被查找到元素的迭代器

get_allocator()返回集合的分配器

insert() 在集合中插入元素

lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器

key_comp() 返回一个用于元素间值比较的函数

max_size() 返回集合能容纳的元素的最大限值

rbegin() 返回指向集合中最后一个元素的反向迭代器

rend() 返回指向集合中第一个元素的反向迭代器

size() 集合中元素的数目

swap() 交换两个集合变量

upper_bound() 返回大于某个值元素的迭代器

value_comp() 返回一个用于比较元素间的值的函数

6 用例

6.1 使用用例

#include<iostream>

#include<set>

using namespace std;

typedef struct {

	int a,b;

	char s;

}newtype;

struct compare //there is no ().

{

	bool operator()(const newtype &a, const newtype &b) const

	{

		return a.s<b.s;

	}

};//the “; ” is here;

set<newtype,compare>element;

int main()

{

	newtype a,b,c,d,t;

	a.a=1; a.s='b';

	b.a=2; b.s='c';

	c.a=4; c.s='d';

	d.a=3; d.s='a';

	element.insert(a);

	element.insert(b);

	element.insert(c);

	element.insert(d);

	set<newtype,compare>::iterator it;

	for(it=element.begin(); it!=element.end();it++)

		cout<<(*it).a<<" ";

	cout<<endl;

	for(it=element.begin(); it!=element.end();it++)

		cout<<(*it).s<<" ";

}

 

element自动排序是按照chars的大小排序的;

6. 2 set的构造方法

#include <iostream>

#include <set>

using namespace std;

bool fncomp (int lhs, int rhs) {return lhs<rhs;}

struct classcomp {

	bool operator() (constint& lhs, const int& rhs) const

	{return lhs<rhs;}

};

int main ()

{

	set<int> first; // emptyset of ints

	int myints[]= {10,20,30,40,50};

	set<int> second(myints,myints+5); // pointers used as iterators

	set<int> third (second); // a copyof second

	set<int> fourth(second.begin(), second.end()); // iterator ctor.

	set<int,classcomp> fifth; // classas Compare

	bool(*fn_pt)(int,int) = fncomp;

	set<int,bool(*)(int,int)>sixth (fn_pt); // function pointer as Compare

	return 0;

}


 

 

 

 

 

 

 

LabVIEW程序设计与应用实例,包括: 信号处理 .....................\........\........\SIGNAL GENERATION AND PROCESSING.LLB .....................\........\图片控制 .....................\........\........\ROBOT.LLB .....................\........\字符串 .....................\........\......\BINARY VS ASCII.VI .....................\........\......\BUILD STRING.VI .....................\........\......\EXTRACT NUMBERS.VI .....................\........\......\PARSE ARITHMETIC EXPRESSION.VI .....................\........\......\PARSE STRING.VI .....................\........\......\PERFORM ONE OPERATION.VI .....................\........\......\PROCESS OPERATORS.VI .....................\........\数学分析 .....................\........\........\FIR WINDOWED FILTER DESIGN.VI .....................\........\........\GENERAL LS FIT.LLB .....................\........\数组 .....................\........\....\BUILDING ARRAYS.VI .....................\........\....\BUILDING TABLES.VI .....................\........\....\SEPARATE ARRAY VALUES.VI .....................\........\....\TEMPERATURE ANALYSIS.VI .....................\........\文件IO .....................\........\......\BINARYFILE_IO.VI .....................\........\......\DATALOGFILE_IO.LLB .....................\........\......\TEXTFILE_IO.VI .....................\........\水箱模拟 .....................\........\........\TANK SIMULATION.LLB .....................\........\波形图 .....................\........\......\CHARTS.VI .....................\........\......\GRAPH CONTROL.LLB .....................\........\......\GRAPH CONTROL.VI .....................\........\......\GRAPH WAVEFORM ARRAYS.VI .....................\........\......\HOW TO CLEAR CHARTS & GRAPHS.VI .....................\........\......\WAVEFORM GRAPH.VI .....................\........\......\XY_CHART.LLB .....................\........\......\XY_GRAPH.LLB .....................\........\结构 .....................\........\....\CALCULAT
### std::multiset erase(value) 的行为 在 C++ 标准库中,`std::multiset` 是一个允许存储重复元素的有序关联容器。对于 `std::multiset::erase` 方法,当使用 `erase(const key_type& k)` 形式时,它会删除所有键等于 `k` 的元素,而不仅仅是第一个匹配的元素[^1]。 以下是具体的行为描述示例代码: - 如果调用 `erase(const key_type& k)`,则会从 `std::multiset` 中移除所有值等于 `k` 的元素,并返回被删除的元素数量。 - 如果没有找到匹配的元素,则不会进行任何操作,且返回值为 0。 以下是一个示例代码,展示 `std::multiset::erase` 的行为: ```cpp #include <iostream> #include <set> int main() { std::multiset<int> ms = {1, 2, 2, 3, 3, 3}; // 删除所有值为 2 的元素 size_t count = ms.erase(2); std::cout << "Deleted " << count << " elements with value 2." << std::endl; // 输出剩余元素 for (const auto& elem : ms) { std::cout << elem << " "; } std::cout << std::endl; return 0; } ``` 运行上述代码后,输出结果如下: ``` Deleted 2 elements with value 2. 1 3 3 3 ``` 这表明 `std::multiset::erase(const key_type& k)` 删除了所有值为 `2` 的元素,而不仅仅是第一个匹配的元素[^1]。 ### 注意事项 - 如果需要删除特定位置的单个元素,可以使用迭代器版本的 `erase(const_iterator position)` 方法。 - 如果需要删除一个范围内的元素,可以使用 `erase(const_iterator first, const_iterator last)` 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值