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,谢谢合作。

时间: 2024-10-04 09:19:24

stl之set集合容器应用基础的相关文章

set集合容器应用基础

set集合容器使用一种称为红黑树(Red-Black Tree) 的平衡二叉检索树的数据结构,来组织泛化的元素数据.每个节点包含一个取值红色或黑色的颜色域,以利于进行树的平衡处理.作为节点键值的元素的插入,必须确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值.不会将重复的键值插入容器,也不需要指定具体的插入位置,而按元素在树中的关联关系,进行位置检索和插入,元素的删除亦然. 元素数据的检索,使用的是二叉检索树的中序遍历算法,检索的效率高于vector. deque 和

C++ STL set集合容器

汇总了一些set的常用语句,部分参考了这篇:http://blog.163.com/jackie_howe/blog/static/199491347201231691525484/ #include<set> 实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节 点的键值,小于右子树所有节点的键值:另外,还得保证根节点左子树的高度与右子树高度相等.平衡二叉检索树使用中序遍历算法,检索效率高于vector.

01.Python基础-3.集合容器

1 列表list 1.1 列表介绍 Python内置的一种数据类型是列表:list. 有序的集合,可随时添加和删除其中的元素. 每个元素都分配一个数字 --它的位置,或索引.0,1,2,3-- 可存放各种类型的数据 1.2 定义列表 列表名 = [值1,值2,值3.......] 1.3 列表-查 index count len max min 根据下标查找值 值 = xxx[index] name = ['a', 'b', 'c'] # 下标从0开始 n1 = name[0] # 'a' n2

C++STL之multiset多重集合容器

multiset多重集合容器 multiset与set一样, 也是使用红黑树来组织元素数据的, 唯一不同的是, multiset允许重复的元素键值插入, 而set则不允许. multiset也需要声明头文件包含"#include<set>", 由于它包含重复元素, 所以, 在插入元素, 删除元素, 查找元素上较set有差别. 1.1multiset元素的插入 下面这个程序插入了重复键值"123", 最后中序遍历了multiset对象. #include&

C++标准模板库STL算法与自适应容器(栈和队列)

参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在顺序容器的基础上按照stack.queue的性质进行定制实现的.所以,本篇博文将言简意赅地总结出需要掌握的纲要. 一.STL算法 查找.搜索.删除.计数.排序等都是一些通用算法,STL通过模板函数提供了这些算法,可通过迭代器对容器进行操作.需要包含<algorithm>头文件. 1. find,f

stl中顺序性容器,关联容器两者粗略解释

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时

STL中的set容器的一点总结2

http://blog.csdn.net/sunshinewave/article/details/8068326 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.

set集合容器

近期学习了STL中set的使用,在此写一点点总结和自己的一些体悟. set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值:另外,还得确保根节点的左子树的高度与有字数的高度相等,这样,二叉树的高度最小,从而检索速度最快.要注意的是,它不会重复插入相同键值的元素,而采取忽略处理. 平衡二叉检索树的检索使用中序遍历算法,检索效

第15章 hash_set哈希集合容器

/* 第15章 hash_set哈希集合容器   15.1 hash_set技术原理   15.2 hash_set应用基础   15.3 本章小结 略 */