C++中的set

1set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,


删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完


成,效率非常高。 setmultiset的区别是:set插入的元素不能相同,但是multiset


可以相同。


 创建 multiset<ss> base;


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


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


 Setmultiset都是引用<set>头文件,复杂度都是logn




2Set中的元素可以是任意类型的,但是由于需要排序,所以元素必须有一个序,即


大小的比较关系,比如 整数可以用<比较.


3,自定义比较函数;


 include<set>


 typedef struct


 { 定义类型 }


 ss(类型名);

 struct cmp

 {


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

 { 定义比较关系<}

 };

 (运算符重载,重载<)


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


 注:定义了<,==和>以及>=,<=就都确定了,STL的比较关系都是用<来确


定的,所以必须通 过定义< --严格弱小于来确定比较关



4set的基本操作:


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() 返回一个用于比较元素间的值的函数


5,自定义比较函数:

For example


#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自动排序是按照char s的大小排序的;



6.其他的set构造方法;


#include <iostream>


#include <set>


using namespace std;


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


struct classcomp {



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


 {return lhs<rhs;}


};


int main ()

{



 set<int> first; // empty set of ints


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


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


 set<int> third (second); // a copy of second


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



 set<int,classcomp> fifth; // class as Compare


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



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


 return 0;

}

### C++set的数据结构时间复杂度分析 C++中的`set`是一种基于平衡二叉搜索树(通常是红黑树)实现的关联容器,用于存储唯一键值[^3]。由于其底层实现为红黑树,因此插入、查找和删除操作的时间复杂度主要取决于树的高度。 #### 插入操作 在`set`中插入一个元素时,首先需要找到该元素的正确位置以保持树的有序性。这一过程与树的高度相关,对于平衡二叉树而言,高度通常为\(O(\log n)\),其中\(n\)是树中节点的数量。在最坏情况下,红黑树可能退化为线性结构,此时插入操作的时间复杂度为\(O(n)\)。然而,这种最坏情况出现的概率较低[^2]。因此,`set`的插入操作平均时间复杂度为\(O(\log n)\)[^1]。 #### 查找操作 查找操作同样依赖于树的高度。在平衡二叉树中,查找一个元素的时间复杂度为\(O(\log n)\),因为每次比较都可以将搜索范围缩小一半。与插入操作类似,在最坏情况下(红黑树退化为链表),查找操作的时间复杂度为\(O(n)\)[^2]。但在实际应用中,`set`的查找操作通常表现为\(O(\log n)\)[^1]。 #### 删除操作 删除操作需要先定位目标元素,然后再调整树的结构以维持平衡。定位过程的时间复杂度为\(O(\log n)\),而调整树结构的操作也依赖于树的高度,因此删除操作的平均时间复杂度为\(O(\log n)\)[^1]。在最坏情况下,删除操作的时间复杂度为\(O(n)\)[^2]。 ### 示例代码 以下是一个简单的示例,展示如何使用`set`进行插入、查找和删除操作: ```cpp #include <iostream> #include <set> int main() { std::set<int> mySet; // 插入操作 mySet.insert(10); mySet.insert(5); mySet.insert(7); // 查找操作 if (mySet.find(5) != mySet.end()) { std::cout << "Element 5 found." << std::endl; } // 删除操作 mySet.erase(5); return 0; } ``` ### 总结 C++中`set`的数据结构基于平衡二叉搜索树实现,其插入、查找和删除操作的平均时间复杂度均为\(O(\log n)\)[^1]。尽管在最坏情况下这些操作的时间复杂度可能退化为\(O(n)\)[^2],但这种情况很少发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值