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集合容器应用基础的更多相关文章

  1. 【STL】 set集合容器常用用法

    set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...

  2. STL之set集合容器 【转】

    set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键 ...

  3. C++STL之set集合容器

    set集合容器 set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构, 在 插入元素时, 它会自动调整二叉树的排列, 把该元素放到适当的位置, 以确保每个子树根节点的键 ...

  4. stl之list双向链表容器应用基础

    不同于採用线性表顺序存储结构的vector和deque容器.list双向链表中任一位置的元素差值.插入和删除,都具有高效的常数阶算法时间复杂度O(1). 头文件 #include<list> ...

  5. multiset多重集合容器(常用的使用方法总结)

    关于C++STL中multiset集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. multiset多重集合容器和set集合容器的使用方法大多相同,不同的是multiset多重集合容器允许重复 ...

  6. set集合容器(常用的使用方法总结)

     关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. 构造set集合容器的目的是为了去重+排序+快速搜索.由于set集合容器实现了红黑树多的平衡二叉检索树的数据结构,在插 ...

  7. JAVA基础知识总结15(集合容器)

    集合框架:用于存储数据的容器. 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合.因为集合是可变长度的. 集合和数组的区别: 1: ...

  8. C++ STL set集合容器

    汇总了一些set的常用语句,部分参考了这篇:http://blog.163.com/jackie_howe/blog/static/199491347201231691525484/ #include ...

  9. STL中的set集合容器进行集合运算:并、交、差实例

    集合容器的集合运算:并.交.差: #include "stdafx.h" #include <iostream> #include <set> #inclu ...

随机推荐

  1. 设置fixed,横向滚动条失效

    window.onscroll = function(){ var sl = -Math.max(document.body.scrollLeft,document.documentElement.s ...

  2. 利用js自带函数 数组去重

    <script> ,,]; //原数组 var a=[]; //定义空数组 arr.map(function(x){ //用 map 遍历数组 ){ //如果当前值没有存在空数组中 a.p ...

  3. window安装特定补丁(勒索病毒)

    最近出现震惊的蠕虫病毒(勒索病毒),微软也做出相应的安全补丁来修复 MS17-010.这时有些同学不想打开电脑 的自动更新,这样会下载大量补丁,要更新完这些补丁要好几个小时,为了不影响正常工作,我们就 ...

  4. The Zen of Python, by Tim Peters

    Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Comp ...

  5. HTTP cookies 详解

    http://blog.csdn.net/lijing198997/article/details/9378047

  6. 从Oracle Database 角度来看浪潮天梭K1主机的操作系统选择

    背景: 浪潮天梭k1主机.事实上分好几个类别: K1-950 intel 安腾cpu K1-930 intel 安腾cpu K1-910 intel 安腾cpu K1-800 intel 志强cpu ...

  7. nj10---文件读取

    介绍:fs模块是文件操作的封装,它提供了文件的读取,写入,更名,删除,遍历目录,链接POSIX文件系统操作.与其他模块不同的是,fs模块中所有的操作都提供了异步和同步两个版本,例如读取文件内容函数异步 ...

  8. jquery去重

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  9. bzoj1012: [JSOI2008]最大数maxnumber(貌似是道线段树喔)

    1012: [JSOI2008]最大数maxnumber 题目:传送门 题解: 发现自己空了一道水题... 1~210000建线段树,其实就是一道裸题... 单点修改+区间查询...1A~ 代码: # ...

  10. rest_framework 解析器(下 全局配置使用)

    解析器 一般都是全局设置 参考文档 www.cnblogs.com/wupeiqi/articles/.html REST_FRAMEWORK=( "DEFAULT_PARSER_CLASS ...