stl之set集合容器应用基础
set集合容器使用一种称为红黑树(Red-Black Tree) 的平衡二叉检索树的数据结构,来组织泛化的元素数据。每一个节点包括一个取值红色或黑色的颜色域。以利于进行树的平衡处理。作为节点键值的元素的插入,必须确保每一个子树根节点的键值大于左子树全部节点的键值,而小于右子树全部节点的键值。不会将反复的键值插入容器。也不须要指定详细的插入位置,而按元素在树中的关联关系,进行位置检索和插入。元素的删除亦然。
元素数据的检索。使用的是二叉检索树的中序遍历算法。检索的效率高于vector、 deque和list等容器。
因为採用中序遍历算法可将二叉检索树的键值,由小到大排列遍历出来,因此
set 集合容器蕴含了元素间的有序性。
作为一种关联容器,set 集合容器实现了 Unique Sorted Associative Container 和 Simple Associative Container 概念的函数定义要求。
以熟悉的函数形式提供了元素插入、删除和检索的功能。封装了二叉树的复杂操作。
头文件
include <set>
创建 set 对象
为了管理 set 的二叉树的链表数据,先要利用 set 容器的构造函数,创建一个 set 对象。
1. set(); 用默认的 less<T>函数对象和内存分配器。创建一个没有不论什么数据元素的 set对象。
set<int> s; //创建了一个空的 set 对象 s ,元素类型为 int
2. set(const key_compare& comp);
指定一个比較函数对象comp
来创建 set 对象,内存分配器为默认值。
以下的的代码使用自己定义的函数对象 strLess ,创建一个 set 容器对象 s 。
// 定义字符串比較函数对象 strLess
struct strLess
{
bool operator()(const char* s1,const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
// 创建 set 容器对象 s
set<const char*, strLess> s(strLess()); //能够自己写一个结构体,在创建的时候传入这个结构体。让set 容器元素的排序,依照我们定义的方式来进行。
3. set(const set&); set拷贝构造函数,通过红黑树的拷贝构造函数。实现两个set容器的元素、头节点和节点个数的拷贝。
以下的代码。利用 set 容器对象 s1 。拷贝生成 set 容器对象 s2。
// set<int> s1;
set<int> s2(s1);
4. set(InputIterator first, InputIteratorlast); 用迭代器区间 [first, last)所指的元素。创建一个
set对象。
比如。以下代码将数组 iArray 的元素插入到 set 容器对象 s 的红黑树中。
int iArray[] = {13, 32, 19};
set<int> s(iArray, iArray + 3);
5. set(InputIteratorfirst, InputIterator last, const key_compare& comp);//用迭代器区间 [first, last)所指的元素和
comp函数对象,创建一个 set对象。
比如,以下的代码利用上面定义的 strLess 函数对象和数组 szArray ,创建 set 对象 s。
const char* szArray = {"Hello", "dog", "bird"};
set<const char*, strLess > s(szArray, szArray + 3, strLess());
元素的插入
set 并没有固定的所谓尾部插入 push_back函数。元素的插入一般使用 insert进行动态检索插入。
1. pair<iterator,bool> insert(const value_type& v)
将元素 v
插入 set 容器,要求 v值不与 set容器的不论什么元素反复。否则插入失败。
返回一个
pair配对对象,提供所插入元素的迭代器位置和 true/false插入成功标志
2. iterator insert(iteraotr position, const value_type&v)
将元素 v
插入 set 容器。參数 position仅仅是提示可在 position位置之前插入
v ,所返回的插入位置视实际情况而定,不一定能在 position位置前插入。
3. void insert(InputIterator first, InputIterator last)
将某迭代器区间[first, last)所指的数据作为元素,插入到set容器。
假设希望提供一个是否插入成功的信息。能够使用返回 pair 对象的 insert 函数进行插入。如以下的代码所看到的。
set<int> sInt;
sInt.insert(10);
pair<set<int>::iterator, bool> p = sInt.insert(19);
if(p.second)
cout<<"插入新元素"<<*(p.first) << endl;
else
cout<<"已存在该元素,不反复插入"<<endl;
元素的删除
与插入一样,set 容器也具有高效的红黑树元素的删除处理。并自己主动又一次调整内部的红黑树平衡。
1. void erase(iterator position); 删除 position所指的元素
2. size_type erase(const key_type& k); 删除等于键值 k的那个元素,对于 set容器来说,此函数总是返回值1。由于
set容器不会出现反复的元素值(键值)
3. void erase(iterator first, iterator last); 删除 set迭代器区间 [first,last)上的全部元素
4. void clear(); 删除全部元素。但不会删除内部红黑树的头节点
元素的搜索
set容器提供了一个应用红黑树进行搜索的函数 find ,返回的迭代器值位搜索到的元素位置,假设元素不存在。则返回一个 end结束元素的位置。
iterator find(constkey_type &k) const
#include <iostream>
#include <set>
int main ()
{
std::set<int> myset;
std::set<int>::iterator it;
//存入一些初始化值:
for (int i=1; i<=5; i++) myset.insert(i*10); // 10 20 30 40 50 it=myset.find(20);//找到
myset.erase (it);//删除
myset.erase (myset.find(40));//假设找到。则删除
std::cout << "myset contains:";
for (it=myset.begin(); it!=myset.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
其它函数
set提供的函数还有empty、size、swap、lower_bound、upper_bound和equal_range等
lower_bound(); 下确界函数,返回第一个 > elem 元素的迭代器
upper_bound(); 上确界函数,返回第一个 > elem 元素的迭代器
equal_range(); 返回容器中与elem相等的上下限的两个迭代器。
上限是闭区间,下限是开区间,如[beg,end)。
以上函数返回两个迭代器,而这两个迭代器被封装在pair中。
#include <iostream>
#include <set>
int main ()
{
std::set<int> myset;
for (int i=1; i<=5; i++)
myset.insert(i*10); // myset: 10 20 30 40 50
std::pair<std::set<int>::const_iterator,std::set<int>::const_iterator> ret;
ret = myset.equal_range(30);
std::cout << "the lower bound points to: " << *ret.first << '\n';
std::cout << "the upper bound points to: " << *ret.second << '\n';
return 0;
}
转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46745121,谢谢合作。
stl之set集合容器应用基础的更多相关文章
- 【STL】 set集合容器常用用法
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...
- STL之set集合容器 【转】
set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键 ...
- C++STL之set集合容器
set集合容器 set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构, 在 插入元素时, 它会自动调整二叉树的排列, 把该元素放到适当的位置, 以确保每个子树根节点的键 ...
- stl之list双向链表容器应用基础
不同于採用线性表顺序存储结构的vector和deque容器.list双向链表中任一位置的元素差值.插入和删除,都具有高效的常数阶算法时间复杂度O(1). 头文件 #include<list> ...
- multiset多重集合容器(常用的使用方法总结)
关于C++STL中multiset集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. multiset多重集合容器和set集合容器的使用方法大多相同,不同的是multiset多重集合容器允许重复 ...
- set集合容器(常用的使用方法总结)
关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. 构造set集合容器的目的是为了去重+排序+快速搜索.由于set集合容器实现了红黑树多的平衡二叉检索树的数据结构,在插 ...
- JAVA基础知识总结15(集合容器)
集合框架:用于存储数据的容器. 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合.因为集合是可变长度的. 集合和数组的区别: 1: ...
- C++ STL set集合容器
汇总了一些set的常用语句,部分参考了这篇:http://blog.163.com/jackie_howe/blog/static/199491347201231691525484/ #include ...
- STL中的set集合容器进行集合运算:并、交、差实例
集合容器的集合运算:并.交.差: #include "stdafx.h" #include <iostream> #include <set> #inclu ...
随机推荐
- ORACLE查询优化之is null和is not null优化
最近工作的时候遇到了比较大的数据查询,自己的sql在数据量小的时候没问题,在数据量达到300W的时候特别慢,只有自己优化sql了,以前没有优化过,所以记录下来自己的优化过程,本次是关于is null和 ...
- BZOJ3796 Mushroom追妹纸(二分答案+后缀数组+KMP)
求出一个串使得这个串是\(s1,s2\)的子串.串中不包含\(s3\). 如果没有这个\(s3\)就可以二分答案,然后height小于二分值分一组.看看每组里是不是出现过\(s1,s2\)的后缀.判断 ...
- BZOJ 1050 [HAOI2006]旅行comf(最小生成树)
题意 第一行包含两个正整数,N和M.下来的M行每行包含三个正整数:x,y和v.表示景点x到景点y之间有一条双向公路 ,车辆必须以速度v在该公路上行驶.最后一行包含两个正整数s,t,表示想知道从景点s到 ...
- 使用Jmeter工具对http接口进行压力测试
1.访问apache官网下载Jmeter工具 地址:https://jmeter.apache.org/download_jmeter.cgi 2.解压压缩包后运行bin目录下jmeter.bat启动 ...
- POJ 2175 Evacuation Plan
Evacuation Plan Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Origina ...
- 洛谷 P1524 十字绣
P1524 十字绣 题目背景 考古学家发现了一块布,布上做有针线活,叫做“十字绣”,即交替地在布的两面穿线. 题目描述 布是一个n*m的网格,线只能在网格的顶点处才能从布的一面穿到另一面.每一段线都覆 ...
- 在EA中将画出的ER图转换成SQL脚本
在进行数据库设计的时候,想着正好安装着EA软件呢,看能不能用EA画ER模型.结果发现不仅能画.并且还能进行整套数据库设计(生成SQL脚本). 以下以机房收费系统用户--学生为例.学生能够查看剩余金额. ...
- Cannot find the class file for javax.servlet.ServletContext.
当eclipse中新导入的Java Project的时候.往往会碰到各种各样的问题,以下是个典型的问题: Cannot find the class file for javax.servlet.Se ...
- 怎样实如今Windows下编写的代码,直接在Linux下编译
方法一: 怎样实如今Windows7下编写Linux程序.写完程序以后.不用复制文件,直接在Linux(RHEL6.5)机器上编译最新的代码. 1.首先将Windows的代码目录设置为共享目录: 2. ...
- [湖南师大集训2018 7 26] hunger 解题报告 (SPFA)
饿 (hungry.pas/c/cpp) [背景描述] 给出