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的插入删除效率比用其它序列容器高?

大部分人说,非常easy。由于对于关联容器来说,不须要做内存拷贝和内存移动。

说对了,确实如此。

set容器内全部元素都是以节点的方式来存储。其节点结构和链表差点儿相同。指向父节点和子节点。

结构图可能例如以下:

  A
   / \
  B C
 / \ / \
  D E F G

因此插入的时候仅仅须要稍做变换。把节点的指针指向新的节点就能够了。

删除的时候类似。稍做变换后把指向删除节点的指针指向其它节点也OK了。

这里的一切操作就是指针换来换去,和内存移动没有关系。

(2)为何每次insert之后,曾经保存的iterator不会失效?

iterator这里就相当于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(当然被删除的那个元素本身已经失效了)。

相对于vector来说,每一次删除和插入,指针都有可能失效。调用push_back在尾部插入也是如此。由于为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程中可能已经被其它内存覆盖或者内存已经被释放了。

即使时push_back的时候。容器内部空间可能不够。须要一块新的更大的内存,仅仅有把曾经的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存。最后把须要插入的元素放到最后。那么曾经的内存指针自然就不可用了。特别时在和find等算法在一起使用的时候,牢记这个原则:不要使用过期的iterator。

(3)当数据元素增多时。set的插入和搜索速度变化怎样?

假设你知道log2的关系你应该就彻底了解这个答案。

在set中查找是使用二分查找。也就是说。假设有16个元素,最多须要比較4次就能找到结果,有32个元素,最多比較5次。那么有10000个呢?最多比較的次数为log10000,最多为14次,假设是20000个元素呢?最多只是15次。看见了吧。当数据量增大一倍的时候,搜索次数仅仅只是多了1次,多了1/14的搜索时间而已。

你明确这个道理后,就能够安心往里面放入元素了。

set用法:

begin()        ,返回set容器的第一个元素

end()      ,返回set容器的最后一个元素

clear()          ,删除set容器中的全部的元素

empty()    ,推断set容器是否为空

max_size()   ,返回set容器可能包括的元素最大个数

size()      ,返回当前set容器中的元素个数

rbegin     ,返回的值和end()同样

rend()     ,返回的值和rbegin()同样

简单操作实例:

#include <iostream>
#include <set>using namespace std;int main()
{set<int> s;s.insert(1);s.insert(2);s.insert(3);s.insert(1);cout<<"set 的 size 值为 :"<<s.size()<<endl;cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;s.clear();if(s.empty()){cout<<"set 为空 。!

"<<endl; } cout<<"set 的 size 值为 :"<<s.size()<<endl; cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl; return 0; }

执行结果:

小结:插入3之后尽管插入了一个1,可是我们发现set中最后一个值仍然是3哈,这就是set 。还要注意begin() 和 end()函数是不检查set是否为空的。使用前最好使用empty()检验一下set是否为空.


count() 用来查找set中某个某个键值出现的次数。这个函数在set并非非常有用,由于一个键值在set仅仅可能出现0或1次,这样就变成了推断某一键值是否在set出现过了。

演示样例代码:

#include <iostream>
#include <set>using namespace std;int main()
{set<int> s;s.insert(1);s.insert(2);s.insert(3);s.insert(1);cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;return 0;
}
按 Ctrl+C 复制代码

执行结果:

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;
}

执行结果:

erase(iterator)  ,删除定位器iterator指向的值

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

erase(key_value),删除键值key_value的值

看看程序吧:

#include <iostream>
#include <set>using namespace std;int main()
{set<int> s;set<int>::const_iterator iter;set<int>::iterator first;set<int>::iterator second;for(int i = 1 ; i <= 10 ; ++i){s.insert(i);}//第一种删除s.erase(s.begin());//另外一种删除first = s.begin();second = s.begin();second++;second++;s.erase(first,second);//第三种删除s.erase(8);cout<<"删除后 set 中元素是 :";for(iter = s.begin() ; iter != s.end() ; ++iter){cout<<*iter<<" ";}cout<<endl;return 0;
}

执行结果:

小结:set中的删除操作是不进行不论什么的错误检查的,比方定位器的是否合法等等,所以用的时候自己一定要注意。

find()  。返回给定值值得定位器。假设没找到则返回end()。

演示样例代码:

#include <iostream>
#include <set>using namespace std;int main()
{int a[] = {1,2,3};set<int> s(a,a+3);set<int>::iterator iter;if((iter = s.find(2)) != s.end()){cout<<*iter<<endl;}return 0;
}

insert(key_value); 将key_value插入到set中 。返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置。若key_value已经在set中,则iterator表示的key_value在set中的位置。

inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.

演示样例代码:

#include <iostream>
#include <set>using namespace std;int main()
{int a[] = {1,2,3};set<int> s;set<int>::iterator iter;s.insert(a,a+3);for(iter = s.begin() ; iter != s.end() ; ++iter){cout<<*iter<<" ";}cout<<endl;pair<set<int>::iterator,bool> pr;pr = s.insert(5);if(pr.second){cout<<*pr.first<<endl;}return 0;
}

执行结果:

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

upper_bound(key_value)。返回最后一个大于等于key_value的定位器

演示样例代码:

#include <iostream>
#include <set>using namespace std;int main()
{set<int> s;s.insert(1);s.insert(3);s.insert(4);cout<<*s.lower_bound(2)<<endl;cout<<*s.lower_bound(3)<<endl;cout<<*s.upper_bound(3)<<endl;return 0;
}

执行结果:

本文转自它处。我认为我们可以。。。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/blfshiye/p/4647968.html

STL中间set具体用法!!!!相关推荐

  1. STL 中map的用法详解

    STL 中map的用法详解 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可 ...

  2. vector 清空 Linux,STL容器vector基础用法小结

    STL容器vector基础用法小结根据<ACM程序设计>写的,用实例展示vector用法. 方法:push_back(), insert(), erase(), clear(), size ...

  3. STL 算法接口及用法说明 (二)

    STL 算法接口及用法说明 copy copy 有两个重载,意义和用法较为明显,不做过多说明: template<class _InIt, class _OutIt> inline_Out ...

  4. 总结——STL 常用数据结构及用法

    STL中常用数据结构及用法 C++中的STL(Standard Template Library),即标准模板库,中包含了很多编程时常用的数据结构,省去了自己临时写的麻烦,这里就来总结一下.如果有错误 ...

  5. C++ STL初学之vector用法及使用

    一.在C++中的详细说明 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库. vector之所以被认为是一个容器,是因为它能够像容器一样存放各种 ...

  6. C++ STL容器 —— map/multimap 用法详解

    C++ STL容器 -- map/multimap 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理.但别 ...

  7. STL之sstream的用法

    STL之sstream的用法 说在前面: 库定义了三种类:istringstream.ostringstream和stringstream,分别用来进行流的输入.输出和输入输出操作.另外,每个类都有一 ...

  8. C++ STL 线性容器的用法

    vector vector 是顺序容器的一种,是可变长的动态数组,支持随机访问迭代器,所有stl算法都能对 vector 进行操作. vector 容器在实现时,动态分配的存储空间一般都大于存放元素所 ...

  9. stl之string类用法详细总结

    标准c++中String类非常强大,合理使用,能极大提高编程效率,下面就对string类的用法进行总结. 头文件 #include<string> String类的构造函数如下: 1)   ...

  10. 关于STL中的map用法

      STL中map用法详解         std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力, ...

最新文章

  1. 演讲实录丨吴朝晖院士:从AI到CI——脑机智能的发展
  2. UA SIE545 优化理论基础4 对偶理论简介1 松弛问题与Lagrange对偶
  3. 笔记-项目立项管理-项目的可行性研究
  4. android contentDescription的使用
  5. 多语言应用开发中本地化信息对照表
  6. 使用ActiveMQ支持Spring Integration路由
  7. android 在什么情况下会主动gc_Python 什么情况下会生成 pyc 文件?
  8. 瓜田老梁:FA1# 微服务流控防护场景与应对措施
  9. LINQ语法类似于SQL的语法
  10. 深度学习代码实战——基于RNN的时间序列拟合(回归)
  11. 深度学习知识点全面总结
  12. 2020项目商机_营销“心”思维,赢得“新”商机 ——2020年第二期军师项目顺利落幕...
  13. 带外壳版本4G LTE模块,包括华为ME909系列、移远EC20系列、移远EC200T系列
  14. 单片机流水灯C语言实验报告,单片机LED灯实验报告.doc
  15. 龙芯2f笔记本安装debian错误--bzcat
  16. windows下Edge浏览器Google Chrome与Safari双向同步书签
  17. c语言int函数使用方法,int函数的使用方法_Excel中int函数的操作用法
  18. Masimo宣布旨在协助COVID-19响应努力的远程患者处治解决方案Masimo SafetyNet™全面上市
  19. 分享一些自己的学习经验和技巧
  20. 只因写了一段爬虫,公司200多人被抓!

热门文章

  1. HDU 6030(矩阵快速幂+规律)
  2. 【Java IO流】RandomAccessFile类的使用
  3. 某公司ASP.NET应聘上机试题
  4. 检查PHP扩展是否安装成功
  5. 安全隐患分析和基本系统结构信息的收集
  6. 1 操作系统安全加固
  7. 匿名内部类2(转载)
  8. 创业者请不断自问:我能帮用户解决什么问题?
  9. [转] android自定义布局中的平滑移动
  10. 感悟Microsoft summer Camp 2010