首页 > 其他分享 >116.STL中的set

116.STL中的set

时间:2023-07-23 20:56:10浏览次数:37  
标签:insert set STL 元素 elem 116 c2 c1

116.STL中的set

1.set的简介

set的中文译为集合,知名见其意,因此set容器也就具有集合的属性啦!而集合这个概念大家应该上数学课应该都是学过的哈,集合它具有确定性、互异性、无序性。当然我们这里重点记住它的互异性就OK了,那么什么是互异性呢?就是说一个集合里边是不会出现两个甚至以上相同的元素的(有我没他,有他没我),说明集合还是比较专一的哈,大家以后对待感情也要专一哦!

还有非常重要的一点就是set容器会自动地对元素进行升序排序(从小到大)

使用set时需要包含头文件:

#include<set>

2.set的定义及初始化

定义:

set<数据类型>变量名

例:

//set的定义 
set<int> s1; //定义一个储存数据类型为int的set容器s1 
set<double> s2; //定义一个储存数据类型为double的set容器s2 
set<string> s3; //定义一个储存数据类型为string的set容器s3
set<int> s4[N]; //定义一个储存数据类型为int的set数组,N为大小
set<double> s5[N]; //定义一个储存数据类型为double的set数组,N为大小

构造、拷贝、析构

操作 效果
set c 产生一个空的set/multiset,不含任何元素
set c(op) 以op为排序准则,产生一个空的set/multiset
set c1(c2) 产生某个set/multiset的副本,所有元素都被拷贝
set c(beg,end) 以区间[beg,end)内的所有元素产生一个set/multiset
set c(beg,end, op) 以op为排序准则,区间[beg,end)内的元素产生一个set/multiset
c.~set() 销毁所有元素,释放内存
set<Elem> 产生一个set,以(operator <)为排序准则
set<Elem,0p> 产生一个set,以op为排序准则

3.非变动性操作

操作 效果
c.count(val) 判断容器中是否存在val
c.size() 返回当前的元素数量
c.empty () 判断大小是否为零,等同于0 == size(),效率更高
c.max_size() 返回能容纳的元素最大数量
c1 == c2 判断c1是否等于c2
c1 != c2 判断c1是否不等于c2(等同于!(c1==c2))
c1 < c2 判断c1是否小于c2
c1 > c2 判断c1是否大于c2
c1 <= c2 判断c1是否小于等于c2(等同于!(c2<c1))
c1 >= c2 判断c1是否大于等于c2 (等同于!(c1<c2))

4.特殊的搜寻函数

sets和multisets在元素快速搜寻方面做了优化设计,提供了特殊的搜寻函数,所以应优先使用这些搜寻函数,可获得对数复杂度,而非STL的线性复杂度。比如在1000个元素搜寻,对数复杂度平均十次,而线性复杂度平均需要500次。

操作 效果
count (elem) 返回元素值为elem的个数
find(elem) 返回元素值为elem的第一个元素,如果没有返回end()
lower _bound(elem) 返回元素值为elem的第一个可安插位置,也就是元素值 >= elem的第一个元素位置
upper _bound (elem) 返回元素值为elem的最后一个可安插位置,也就是元素值 > elem 的第一个元素位置
equal_range (elem) 返回elem可安插的第一个位置和最后一个位置,也就是元素值==elem的区间

5.赋值

c1 =c2;

6.交换

操作 效果
c1.swap(c2) 将c1和c2 的元素互换
swap(c1,c2) 同上,全局函数

7.迭代器相关函数

 sets和multisets的迭代器是双向迭代器,对迭代器操作而言,所有的元素都被视为常数,可以确保你不会人为改变元素值,从而打乱既定顺序,所以无法调用变动性算法,如remove()。

操作 效果
c.begin() 返回一个随机存取迭代器,指向第一个元素
c.end() 返回一个随机存取迭代器,指向最后一个元素的下一个位置
c.rbegin() 返回一个逆向迭代器,指向逆向迭代的第一个元素
c.rend() 返回一个逆向迭代器,指向逆向迭代的最后一个元素的下一个位置

8.插入和删除数据

必须保证参数有效,迭代器必须指向有效位置,序列起点不能位于终点之后,不能从空容器删除元素。

操作 效果
c.insert(elem) 插入一个elem副本,返回新元素位置,无论插入成功与否。
c.insert(pos, elem) 安插一个elem元素副本,返回新元素位置,pos为收索起点,提升插入速度。
c.insert(beg,end) 将区间[beg,end)所有的元素安插到c,无返回值。
c.erase(elem) 删除与elem相等的所有元素,返回被移除的元素个数。
c.erase(pos) 移除迭代器pos所指位置元素,无返回值。
c.erase(beg,end) 移除区间[beg,end)所有元素,无返回值。
c.clear() 移除所有元素,将容器清空

例子:

#include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
#include<set>//使用set需要带上这个文件
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用

int main()
{
	set<int> s;//定义 

	s.insert(1);//插入元素1 
	s.insert(3);//插入元素3
	s.insert(2);//插入元素2

	cout << "现有的元素有" << endl;
	for (int c : s) //遍历set,注意set会将元素自动排序,插入的顺序是1、3、2,遍历的顺序是1、2、3  通过foreach遍历
	{
		cout << c << ' ';
	}
	cout << endl;
	cout << endl;

	s.erase(3);//删除元素3

	cout << "删除元素3后,现有的元素有" << endl;

	set<int>::iterator it;//使用迭代器
	for (it = s.begin(); it != s.end(); it++) //遍历set,注意set会将元素自动排序,插入的顺序是1、3、2,遍历的顺序是1、2、3 
	{
		cout << *it << ' ';
	}
	cout << endl;
	cout << endl;

	cout << "现在s.size()==";
	cout << s.size();
	
	cout << ",也即有" << s.size() <<"个元素";
	cout << endl;
	cout << endl;

	cout << "是否包含元素2:" << endl;
	if (s.count(2) != 0)
	{
		cout << "包含元素2,个数为:" << s.count(2) << endl;;
	}
	else
	{
		cout << "不包含元素2" << endl;
	}
	cout << endl;

	if (s.count(3) != 0)
	{
		cout << "包含元素3,个数为:" << s.count(3) << endl;;
	}
	else
	{
		cout << "不包含元素3" << endl;
	}
	cout << endl;

	cout << "s是否是空的:" << endl;
	if (s.empty())
	{
		cout << "即s为空" << endl;;
	}
	else
	{
		cout << "即s不为空" << endl;
	}
	cout << endl;

	s.clear();//清空集合 

	cout << "s是否是空的:" << endl;
	if (s.empty())
	{
		cout << "即s为空" << endl;;
	}
	else
	{
		cout << "即s不为空" << endl;
	}
	cout << endl;

	cout << "s是否是空的:" << endl;
	if (s.size() == 0)//s.size()==0也可以判断集合是否为空,为了考虑代码可读性,一般不用size()代替empty() 
	{
		cout << "s为空" << endl;;
	}
	else
	{
		cout << "即s不为空" << endl;
	}
	cout << endl;

	return 0;
}

输出:

现有的元素有
1 2 3

删除元素3后,现有的元素有
1 2

现在s.size()==2,也即有2个元素

是否包含元素2:
包含元素2,个数为:1

不包含元素3

s是否是空的:
即s不为空

s是否是空的:
即s为空

s是否是空的:
s为空

例子2:

// cont/set1.cpp
#include <iostream>
#include <set>
using namespace std;

int main()
{
    /*type of the collection:
     *-no duplicates
     *-elements are integral values
     *-descending order
     */
    typedef set<int, greater<int> > IntSet;

    IntSet coll1;         // empty set container

    //insert elements in random order
    coll1.insert(4);
    coll1.insert(3);
    coll1.insert(5);
    coll1.insert(1);
    coll1.insert(6);
    coll1.insert(2);
    coll1.insert(5);

    //iterate over all elements and print them
    IntSet::iterator pos;
    for (pos = coll1.begin(); pos != coll1.end(); ++pos) 
    {
        cout << *pos << ' ';
    }
    cout << endl;

    //insert 4 again and process return value
    pair<IntSet::iterator, bool> status = coll1.insert(4);
    if (status.second)
    {
        cout << "4 inserted as element "
            << distance(coll1.begin(), status.first) + 1
            << endl;
    }
    else 
    {
        cout << "4 already exists" << endl;
    }

    //assign elements to another set with ascending order
    set<int> coll2(coll1.begin(), coll1.end());

    //print all elements of the copy
    copy(coll2.begin(), coll2.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    //remove all elements up to element with value 3
    coll2.erase(coll2.begin(), coll2.find(3));

    //remove all elements with value 5
    int num;
    num = coll2.erase(5);
    cout << num << " element(s) removed" << endl;

    //print all elements
    copy(coll2.begin(), coll2.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    return 0;
}

输出:

6 5 4 3 2 1
4 already exists
1 2 3 4 5 6
1 element(s) removed
3 4 6

参考:

【C++ STL】Set和Multiset

标签:insert,set,STL,元素,elem,116,c2,c1
From: https://www.cnblogs.com/codemagiciant/p/17575874.html

相关文章

  • Python | setup.py详解
    setup.py是Python中用于构建、打包和发布第三方库的脚本文件。它通常位于Python库的根目录下,并包含了一些元数据和配置信息,用于指定库的名称、版本、作者、依赖项等。setup.py的内容通常包括以下部分:导入setuptools模块或distutils模块。setuptools是distutils的增强版,提供了更......
  • ARC125F Tree Degree Subset Sum
    感觉挺不错的一道题,不过课上pb好像没有讲。显然树的具体形态对题目影响不大,那么我们知道\(\sum\limits_{i=1}^nd_i=2n-2\)即可扔掉树的条件。即:给定\(n\)个\(d_i\),和为\(2n-2\),求\((x,y)\)满足\(0\lex\len\)且\(\existsS\subseteq\{1,2,\cdotsn\},|S|=x,\sum......
  • 115.STL中的multimap
    115.STL中的multimap1.multimap的基本性质multimap容器是和map容器相似的关联式容器,所谓“相似”,是指multimap容器具有和map容器相同的特性,即multimap容器也存储pair<constK,T>类型的键值对(其中K表示键的类型,T表示值的类型),其中各个键值对的键的值不能被修改;并且,该容器也会自行......
  • 114.STL中的map
    114.STL中的map1.map的简介map是C++STL中的一个关联式容器,它提供一对一的hash,它类似于Python中的字典,也有着键值对(Key-Value)这一说。我们可以通过键(Key)来找到值(Value),但需要注意的是,每个键(Key)只能在map中出现一次哦!map可以储存多种类型的数据,它主要用于一对一映射的情况,map内部......
  • c语言当中的COORD ,GetStdHandle(),SetConsoleCursorPosition(),以及避免清屏和反复刷新
    这是WindowsAPI定义的结构体类型COORD来表示字符在控制台屏幕上的坐标,结构体类型COORD定义为:typedefstruct_COORD{SHORTx;SHORTy;}COORD;使用WindowsAPI GetStdHandle()从一个特定的标准设备获取表示设备的句柄(用来标识不同设备的一个数值),SetConsoleCursor......
  • 113.STL中的pair
    113.STL中的pair1.pair的简介pair是C++STL(标准模板库)中的一个现有容器,它将2个数据整合成一组数据,当我们类似需求的时候就可以使用到pair啦!pair其实有点像Python中字典中的键值对(Key-Value),一个Key对应着一个Value。pair的本质其实就是个结构体,它含有两个成员变量first和second。......
  • mongodb upset
    MongoDB的upsert操作详解简介在MongoDB中,upsert是一种特殊的操作,用于在执行update操作时,如果查询条件不存在,则插入一条新的文档。本文将为刚入行的小白开发者介绍如何实现MongoDB的upsert操作。流程图下面是实现MongoDBupsert的基本流程图:步骤描述1创建MongoDB连接......
  • C++ stl锁的使用
    我们在日常开发中经常要用到锁,这里记录一下实际开发过程中stl提供的锁的使用。1、读写锁读写锁算是用到的比较多的一种类型,主要实现对于同一个共享数据区,一个时间点只能有一个线程进行写(增删改),但可以有多个线程同时读(查)。换句话说,当有一个线程写的时候,其他线程(不管是读线程还是......
  • Map,Set
    MapMap对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值。//创建Map只能通过newconstmyMap=newMap([[1,'one'],[2,'two'],[3,'three'],]);constmap1=newMap();map1.set('a',1);map1.set('b......
  • 112.STL中的array
    112.STL中的array1.array介绍在C++标准库中,array是固定大小的序列容器,array中包含特定个数并且严格按照线性序列排序的元素。因此array允许对元素进行随机访问,指向某一元素的指针可以通过偏移访问其他元素。在array内部,它只保存自己包含的元素,其他任何信息都不保存,包括自身的大......