STL库--set和multiset

23 篇文章 0 订阅
文章详细介绍了C++中的set数据结构,包括set的基本概念、特性,如元素唯一性、自动排序,以及插入、查找、删除等操作。同时提到了multiset(允许重复元素的set)和set的底层实现——红黑树。此外,文章还展示了set的各种成员函数的使用示例。
摘要由CSDN通过智能技术生成

概述

set ,又称集合,实际上就是一组元素的集合,但其中所包含的元素的值是唯一的,且是按一定顺序排列

1.所有元素会根据键值自动排序

2.set与map不同,map有键值又有实值。而set的键值也是实值

3.set不允许键值相同

4.set提供的是只读迭代器不允许修改元素的内容)

        插入的时候就排好序了,要是修改了,顺序就会发生错误。

        允许删除,因为删除不会破坏顺序

因为其内部是通过链表的方式来组织,所以在插入的时候比vector 快,但在查找和末尾添加上比vector 慢。

multiset是允许数据重复的set。其他都一样

set和multiset的底层实现都是红黑树

初始化set对象的方式:

set<T>  v1;//默认的初始化方式,内容为空

set<T>  v2(v1);//v2是v1的一个副本

set<T>  v5(v1.begin(),v1.end());//v5包含v1的一个区域元素[v1.begin,v1.end());

set常用函数

v1.empty():判断集合是否为空,为空返回真,否则为假

v1.insert(数值):将数值插入v1中

        

        返回值是对组。iterator插入的位置,bool是否插入成功

v1.insert(first,second):将定位 器first和定位器second之间的元素插入到set中

int a[] = {1,2,3};

s.insert(a,a+3);

 

v1.begin():返回向量(数组)的首元素地址

v1.end(): 返回向量(数组)的末元素的下一个元素的地址

v1.rbegin():返回逆向队列的第一个数据,即c容器的最后一个数据。

v1.rend():返回逆向队列的最后一个数据的下一个位置,即c容器的第一个数据再往前的一个位置。

vector<int> v;

v.push_back(1);

v.push_back(2);

v.push_back(3);

vector<int>::reverse_iterator it;

for(it = v.rbegin();it!=v.rend();it++){

    cout << *it << "\t";

}

cout << endl;

v1.clear():清空向量

v1.size():返回得到向量中元素的个数

v1=v2

swap(v1.v2):交换两个数组

v1.count():用来查找set中某个某个键值出现的次数。但是由于set中不允许重复,故用来判断某一键值是否在set出现过了

 

v1.erase(iterator):删除定位器iterator指向的值

v1.erase(first,second):删除定位器first和second之间的值

v1.erase(key_value):删除键值key_value的值

 

v1.find():查找一个数,返回给定值的定位器,找不到就返回迭代器end()

 

v1.lower_bound():返回第一个大于等于key_value的定位器

v1.upper_bound():返回第一个大于key_value的定位器

v1.equal_range():返回一对定位器,分别表示第一个大于或等于给定关键值的元素和第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值

#include <iostream>

#include <set>

 

using namespace std;

 

int main(){

     set<int> s;

     set<int>::iterator iter;

     for(int i = 1 ; i <= 5; ++i)

     {

         s.insert(i);

     }

     for(iter = s.begin() ; iter != s.end() ; ++iter)

     {

         cout<<*iter<<" ";

     }

     cout<<endl;

     pair<set<int>::const_iterator,set<int>::const_iterator> pr;

     pr = s.equal_range(3);

     cout<<"第一个大于等于 3 的数是 :"<<*pr.first<<endl;

     cout<<"第一个大于 3的数是 : "<<*pr.second<<endl;

     return 0;

}

set的所有函数

1.set的构造函数

set<T> st;//set 默认构造函数:

mulitset<T> mst; //multiset 默认构造函数:

set(const set &st);//拷贝构造函数

2.set的赋值

set& operator=(const set &st);//重载等号操作符

swap(st);//交换两个集合容器

3.set大小函数

size();//返回容器中元素的数目

empty();//判断容器是否为空

4.set 插入和删除操作

insert(elem);//在容器中插入元素。

        返回值是对组。iterator插入的位置,bool是否插入成功

clear();//清除所有元素

erase(pos);//删除 pos 迭代器所指的元素, 返回下一个元素的迭代器。

erase(beg, end);//删除区间[beg,end)的所有元素 , 返回下一个元素的迭代器。

erase(elem);//删除容器中值为 elem 的元素。

5.set 查找操作

find(key);//查找键 key 是否存在,若存在, 返回该键的元素的迭代器; 若不存在, 返回 set.end();

count(key);//查找键 key 的元素个数

下限:lower_bound(keyElem);//返回第一个 key>=keyElem 元素的迭代器。若不存在, 返回 set.end();

上限 :upper_bound(keyElem);//返回第一个 key>keyElem 元素的迭代器。若不存在, 返回 set.end();

equal_range(keyElem);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值