set容器

c++ stl set 有序性

醉酒当歌 提交于 2019-11-27 19:05:08
stl 中的set 是有序容器,可以通过传入自定义比较器函数对象的方式,设定想要使用的比较方法。 使用迭代器遍历set的时候,遍历的顺序就是set 中比较器定义的顺序。 set < int > s; // 插入的时候按照从大到小的顺序插入 for ( int i = 10 ; i > 0 ; i--) { s.insert(i); } set < int > ::iterator it; // 遍历的时候的输出是从小到大 for (it = s.begin(); it != s.end(); ++it) { cout << *it ; } 可以通过传入比较器函数对象的形式,更改set排序方式 // 从大到小排序的比较器函数对象 struct Compartor { bool operator ()( const int lhs, const int rhs) const { return rhs < lhs; } }; // 声明使用自定义比较器的set set < int ,Compartor> s; // 按照从小到大的顺序插入 for ( int i = 0 ; i < 10 ; i++) { s.insert(i); } set < int > ::iterator it; // 输出的顺序的作用是从大到小 for (it = s.begin(); it != s.end(

C++ STL set详解

时间秒杀一切 提交于 2019-11-27 19:04:54
C++ STL set详解 一.解释   关于set,必须说明的是set关联式容器。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。 二.用法 1.头文件 #include <set> 2.常用操作 set < int > s 定义一个 set 容器 类型为 int 型 s.begin() 返回指向第一个元素的迭代器 s.clear() 清除所有元素 s.count() 返回 bool 型,有返回 1 ,无返回 0 s.empty() 如果集合为空,返回 true s.end() 返回指向最后一个元素之后的迭代器,不是最后一个元素 s.erase() 删除集合中的元素 s.find() 返回一个指向被查找到元素的迭代器,如果没找到则返回end() s.insert() 在集合中插入元素 s.size() 集合中元素的数目 s.swap() 交换两个集合变量 三.例子: #include <iostream> #include <set> using namespace std ; int main() { int i; set < int > set1; for (i= 0 ; i< 10 ; ++i) set1.insert(i); set < int > :

STL之set的查增删

泄露秘密 提交于 2019-11-27 19:04:04
本文参考自徐晓鑫《后台开发》,记录之。 概念: C++ STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树。 set是关联式容器,用来存储同一数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都是唯一,而且系统根据元素的值能自动进行排序。值得注意的是set中元素不能直接被改变,这也是本文标题中并没有设定为增删改查的原因。 头文件 < set > 模板原型 key 为元素(键值)类型 template < class Key , class Compare =less< Key >, class Alloc=STL_DEFAULT_ALLOCATOR( Key ) > set是关联式容器,插入删除效率比其他序列容器高。因为不需要做内存拷贝和内存移动。set容器内所有元素都是以节点的方式来存储,本质是链表的操作。 每次insert后,iterator不会失效。因为iterator相当于指向节点的指针,内存没有变,指向内存的指针不会失效。 当数据元素增多时,set的插入和搜索速度以log2(n)变化。 操作: (1)set对象的创建有5种方式。 (2)元素的插入有3种方式。 (3)元素的删除有4种方式。 (4)元素的查找有2种方式。 (5)其他set中常用方法。 s .begin ()  返回

ACM cpp stl set 用法

别来无恙 提交于 2019-11-27 19:03:40
stl set//集合,元素唯一不可重复 使用平衡的搜索树——红黑树实现 因此插入、删除和查找数据时间复杂度为O(logN) //定义 set<int> s1; //扫描整一个set所有的元素,用迭代器 for (set<int>::iterator i=s1.begin(); i!=s1.end(); i++) cout<<(*i)<<endl; //元素插入: //1,(常用)insert,插入value,返回pair配对对象,可以根据.second判断是否插入成功。(提示:value不能与set容器内元素重复) s1.insert(2);//插入2 //元素删除 //1,(常用)size_type erase(value) 移除set容器内元素值为value的所有元素,返回移除的元素个数 //2,void erase(&pos) 移除pos位置上的元素,无返回值 //3,void erase(&first, &last) 移除迭代区间[&first, &last)内的元素,无返回值 //4,void clear(), 移除set容器内所有元素 s1.erase(2); //删除2 //元素查找 //(常用)iterator find(value)返回value所在位置,找不到value将返回end() //count(value)返回set对象内元素值为value的元素个数

L2-005. 集合相似度 STL set用法

不羁的心 提交于 2019-11-27 18:57:39
题解:又学到了c++,STL的用法了,在实验室用了两个多小时学习set,stl真的很强大,从用过的map等等体会到了,又get到了set。尽管自己很菜,还是分享一下咯,马上要参加天梯赛了,还是多想学一些东西,感谢网上博主写的博客,受益匪浅。 set概述 和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。 在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。 再稍微说一下迭代器的实现。迭代器是一个对象,vector的迭代器是封装了数组下标;list、map、set的迭代器是封装了元素节点的指针。 还有一点,从数学层面,set的一个集合,好比一个袋子里面装了好多个小球。但是红黑树是一种特殊的二叉搜索树,set中的元素根据其值的大小在红黑树中有特定的位置,是不可移动的。所以,1是search操作效率会很高O(log n)

STL容器Set的使用

放肆的年华 提交于 2019-11-27 18:57:14
首先了解一下set,我们所知道的set是STL中的一个容器,但是set实质上也是有不同的版本,我们最根本的划分就是根据其底层实现分别是红黑树和hash表分为两种,首先这两种结构最本质的区别就是有序和无序,红黑树的存储是有序的而hash表是无序存储,但它并不影响set的最主要的用法就是查找,而从查找角度来说hash表是更优于红黑树,从时间复杂度进行分析,红黑树的时间复杂度为O(logN),而hash表的时间复杂度为O(1)。所以说hash表构建的set更高效。所以在对时间要求比较严格的情况下,可以优先采用hash表构建的set,即unordered_set。 首先学习set的所有接口和使用方法,接口分为默认的成员函数,迭代器,大小和容量,增删查改和一些其他函数。 默认的成员函数 即构造,析构,拷贝构造,赋值运算符等函数,使用方法没有特殊的要求。 迭代器 正向迭代器的使用还是常规意义上的使用方法,但是方向迭代器存在一些问题,按照我们规定反向迭代器从最后一个元素开始,结束应该是第一个元素的前一个,但是 从图上可以看出在调用了反向迭代器之后并没有从最后一个元素开始,而是从正向迭代器的end()的位置开始的,打开头文件可以发现反向迭代器直接调用了正向迭代器,所以在使用时注意。这可能是编译器的差异,但是正确来说反向迭代器应该从最后一个元素开始。 大小和容量 有三个函数,分别是empty()

C++STL中的set用法

瘦欲@ 提交于 2019-11-27 18:56:44
目录 先来看看基本用法 关于set 【关联型容器概述】 关于set有下面几个问题: (1)为何map和set的插入删除效率比用其他序列容器高? (2)为何每次insert之后,以前保存的iterator不会失效? (3)当数据元素增多时,set的插入和搜索速度变化如何? 【创建】 【删除】 【关于set中元素的顺序】 默认定义了比较函数 自定义排序函数 【set中插入结构体】 先来看看基本用法 #include<iostream> #include<set>//set 需要的头文件 using namespace std; int main(){ multiset<int> myset;//创建set for(int i = 0; i < 10; i++){ myset.insert(10-i); //插入元素 } cout<<"第一个元素:"; cout<<*myset.begin() <<endl; //返回set容器的返回指向第一个元素的迭代器 记得要加星号begin()返回的是一个指针 cout<<"最后一个元素:"; cout<< *myset.end() <<endl; //返回set容器的最后一个元素 cout<<"是否为空:"; cout<<boolalpha<< myset.empty() <<endl; //判断set容器是否为空 cout<< "元素个数:";

STL之Set:Set的基本用法

有些话、适合烂在心里 提交于 2019-11-27 18:56:28
set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值;另外,还得确保根节点的左子树的高度与有字数的高度相等,这样,二叉树的高度最小,从而检索速度最快。要注意的是,它不会重复插入相同键值的元素,而采取忽略处理。 平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。 Set容器和其他容器差不多,无非就是相同的值不存,存进去自动排序好了。 构造set集合的主要目的是为了快速检索,使用set前,需要在程序头文件中包含声明“#include<set>”。 1.创建set集合对象 创建set对象时,需要指定元素的类型,这一点和其他容器一样。 #include<iostream> #include<set> using namespace std; int main() { set<int> s; return 0; } 2.元素的插入与中序遍历 采用inset()方法把元素插入到集合中,插入规则在默认的比较规则下,是按元素值从小到大插入

STL中的set容器的用法

試著忘記壹切 提交于 2019-11-27 18:56:19
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。 关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。 关于set有下面几个问题: (1)为何map和set的插入删除效率比用其他序列容器高? 大部分人说,很简单,因为对于关联容器来说,不需要做内存拷贝和内存移动。说对了,确实如此。set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多

C++ STL set用法小结

心不动则不痛 提交于 2019-11-27 18:56:03
STL里面的一个实用的的容器set,可以称之为集合,在里面存放的元素 唯一 , 确定 。 set会自动对容器里的元素排序。 所需头文件: #include<set> set中常用方法: begin():返回第一个元素的地址. end():返回最后一个元素的地址. empty():判断集合是否为空. clear():清空set中所有元素. max_size():返回set容器可能包含的元素最大个数. size():返回当前容器中元素的个数. count():返回set中某个键值的个数,因为一个键值在set中只能出现一次或0次,也就变成了判断该元素是否出现. equal_range():返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值. erase(it):删除迭代器指针it处元素. insert():插入某个元素. 代码演示: #include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <cstring> #include <cmath> #include