`
anson_xu
  • 浏览: 516669 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

STL中的"集合类"的定义使用

 
阅读更多

STL 中的" 集合类" 的定义使用

 

 

#include   <set>
#include   <iostream>
using   namespace   std;
typedef   set <double,   less <double> ,   allocator <double>   >   set_type;
ostream&   operator < <(ostream&   out,   const   set_type&   s)
{
copy(s.begin(),   s.end(),ostream_iterator <set_type::value_type,char> (cout, "   "));
return   out;
}
int   main(void)
{
//   create   a   set   of   doubles
set_type       sd;
int                   i;
for   (i   =   0;   i   <   10;   ++i)   {
//   insert   values
sd.insert(i);
}

//   print   out   the   set
cout   < <   sd   < <   endl   < <   endl;
//   now   let’s   erase   half   of   the   elements   in   the   set
int   half   =   sd.size()   > >   1;
set_type::iterator   sdi   =   sd.begin();
advance(sdi,half);
sd.erase(sd.begin(),sdi);
//   print   it   out   again
cout   < <   sd   < <   endl   < <   endl;
//   Make   another   set   and   an   empty   result   set
set_type   sd2,   sdResult;
for   (i   =   1;   i   <   9;   i++)
sd2.insert(i+5);
cout   < <   sd2   < <   endl;
//   Try   a   couple   of   set   algorithms
set_union(sd.begin(),sd.end(),sd2.begin(),sd2.end(),

    inserter(sdResult,sdResult.begin()));
cout   < <   "Union: "   < <   endl   < <   sdResult   < <   endl;
sdResult.erase(sdResult.begin(),sdResult.end());
set_intersection(sd.begin(),sd.end(),
  sd2.begin(),sd2.end(),
  inserter(sdResult,sdResult.begin()));
cout   < <   "Intersection: "   < <   endl   < <   sdResult   < <   endl;
return   0;
}

Program   Output

0   1   2   3   4   5   6   7   8   9
5   6   7   8   9
6   7   8   9   10   11   12   13
Union:
5   6   7   8   9   10   11   12   13
Intersection:
6   7   8   9

 

#include   <iostream>
#include   <set>
using   namespace   std;
int   main(int   argc,   char*   argv[])
{
                set <int>   myset;
                for(int   i=1;i <=10;i++)
                myset.insert(i);
                set <int> ::iterator   it;
                for(it=myset.begin();it!=myset.end();++it)
                cout < <*it;
                return   0;
}

 

C++ Sets(集合)
    set和map一样属于关联容器,set是集合,map是映射。若元素类型为int,double,string就会自动进行(默认是升序)排序(使用平衡二叉树来实现),使用自定义类型而未定义比较运算符就不能自动排序了。set容器不支持随机访问。

函数列表:
begin()返回指向第一个元素的迭代器
clear()清除所有元素
count()返回某个值元素的个数
empty()如果集合为空,返回true
end()返回指向最后一个元素的迭代器
equal_range()返回集合中与给定值相等的上下限的两个迭代器
erase()删除集合中的元素
find()返回一个指向被查找到元素的迭代器
get_allocator()返回集合的分配器
insert()在集合中插入元素
lower_bound()返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()返回一个用于元素间值比较的函数
max_size()返回集合能容纳的元素的最大限值
rbegin()返回指向集合中最后一个元素的反向迭代器
rend()返回指向集合中第一个元素的反向迭代器
size()集合中元素的数目
swap()交换两个集合变量
upper_bound()返回大于某个值元素的迭代器
value_comp()返回一个用于比较元素间的值的函数

////////////////////////////////////////////////////////////////////////////////////
构造函数
explicit set(const Pred& comp = Pred(), const A& al = A());
set(const set& x);
set(const value_type *first, const value_type *last,
    const Pred& comp = Pred(), const A& al = A());
实际中可能使用的形式:
1.set c 定一一个空的set对象。
2.set c(op) 定一一个空的set对象,指定排序规则。
3.set c(set& other) 定义一个set对象,拷贝所有的other元素到c中。
4.set c(begin, end, op) 定义一个set对象,拷贝所有的从begin到end的元素到c中,并指定op进行排队。
5.set c(begin, end) 定义一个set对应,初始化c从begin到end。

begin
语法:
iterator begin();
返回指向当前集合中第一个元素的迭代器。
clear
语法:
void clear();
清除当前集合中的所有元素。
count
语法:
size_type count( const key_type &key );
返回当前集合中出现的某个值的元素的数目。
empty
语法:
bool empty();
如果当前集合为空,返回true;否则返回false。
end
语法:
const_iterator end();
返回指向当前集合中最后一个元素的迭代器。
equal_range
语法:
pair equal_range( const key_type &key );
返回集合中与给定值相等的上下限的两个迭代器。
erase
语法:
void erase( iterator i );
void erase( iterator start, iterator end );
size_type erase( const key_type &key );
说明:
1. 删除i元素;
2. 删除从start开始到end结束的元素;
3. 删除等于key值的所有元素(返回被删除的元素的个数)。
find
语法:
iterator find( const key_type &key );
在当前集合中查找等于key值的元素,并返回指向该元素的迭代器。如果没有找到,则返回end()。
get_allocator
语法:
allocator_type get_allocator();
返回当前集合的分配器。
insert
语法:
iterator insert( iterator i, const TYPE &val );
void insert( input_iterator start, input_iterator end );
pair insert( const TYPE &val );
说明:
1. 在迭代器i前插入val;
2. 将迭代器start开始到end结束返回内的元素插入到集合中;
3. 在当前集合中插入val元素,并返回指向该元素的迭代器和一个布尔值来说明val是否成功的被插入了。(应该注意的是在集合(Sets)中不能插入两个相同的元素。)
示例:
#include <iostream>
#include <set>
#include<string>
using namespace std;
typedef struct tagStudentInfo
{
       int      nID;
       string   strName;
       bool operator <(tagStudentInfo const& _A) const//升序排列
       {
          //这个函数指定排序策略,按nID排序,如果nID相等的话,按strName排序
           if(nID<_A.nID) return true;
           if(nID == _A.nID) return strName.compare(_A.strName) < 0;
           return false;
       }
}StudentInfo,*PStudentInfo; //学生信息

void main()
{

    set<StudentInfo>setStudent;
    StudentInfo stuInfo;
    stuInfo.nID = 1;
    stuInfo.strName="student_one";
    pair<set<StudentInfo>::iterator,bool>set_ptr;
set_ptr=setStudent.insert(stuInfo);
   
    stuInfo.nID=1;
    stuInfo.strName="student_one";
    set_ptr=setStudent.insert(stuInfo);
    if(!set_ptr.second){ cout<<"don`t insert!"<<endl; }
   
    stuInfo.nID=2;
    stuInfo.strName="student_two";
    set_ptr=setStudent.insert(stuInfo);
    if(!set_ptr.second){ cout<<"don`t insert 2!"<<endl; }
set<StudentInfo>::iterator p=setStudent.begin();
    for(p;p!=setStudent.end();p++)
{
     cout<<(*p).nID<<" "<<(*p).strName<<endl;
}
}
输出结果:
        don`t insert!
        1 student_one
        2 student_two

lower_bound
语法:
iterator lower_bound( const key_type &key );
返回一个指向小于或者等于key值的第一个元素的迭代器
key_comp
语法:
key_compare key_comp();
返回一个用于元素间值比较的函数对象。
max_size
语法:
size_type max_size();
返回当前集合能容纳元素的最大限值。
rbegin
语法:
reverse_iterator rbegin();
返回指向当前集合中最后一个元素的反向迭代器。
rend
语法:
reverse_iterator rend();
返回指向集合中第一个元素的反向迭代器。
size
语法:
size_type size();
返回当前集合中元素的数目。
swap
语法:
void swap( set &object );
交换当前集合和object集合中的元素。
upper_bound
语法:
iterator upper_bound( const key_type &key );
在当前集合中返回一个指向大于Key值的元素的迭代器。
value_comp
语法:
value_compare value_comp();
返回一个用于比较元素间的值的函数对象。
set的集合功能(须#include<algorithm>):
1.两个有序集的并.
set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s,s.begin()));
三个set对象,分别为s1,s2,s.set_union的功能是将s1的某个序列(比如[s1.begin(),s1.end()))与s2的某个序列(比如[s2.begin(),s2.end()))合并,然后把合并序列插入到s中。

2.两个有序集的交.
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s,s.begin()));

3.两个有序集的差.
set_difference (s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s,s.begin()));

分享到:
评论

相关推荐

    stl速成 基本的stl操作

    STL(Standard Template Library)是一种强大的C++库,提供了大量的模板类和函数,可以在OOP和常规编程中使用。STL的主要特点是数据结构和算法的分离,使得它具有广泛的通用性。 STL的特点: 1. 数据结构和算法的...

    【c++ Stl教程】stl使用及stl编程

    这意味着你定义一次算法或容器,就可以应用于整数、浮点数、自定义类等不同类型的数据。 在学习STL时,掌握其设计理念、工作原理和使用方法至关重要。实践是检验理解的最好方式,尝试编写使用STL的代码,解决实际...

    C 语言版的stl简单实现

    总的来说,这个C语言版的STL集合库是为了弥补C语言在数据结构和算法库上的不足,让开发者能够在C项目中享受到类似C++ STL的便利。它可能并不具备C++ STL的所有功能,但至少提供了基础的数据结构和算法,使得代码的...

    走近STL-STL入门

    3. 算法:STL包含了一系列预定义的算法,如排序(sort)、查找(find)、合并(merge)等。这些算法可以应用于各种容器,提高了代码的复用性和效率。 4. 函数对象(或适配器):函数对象是能够像普通函数那样使用的...

    C++ STL程序员面试题

    - 举例说明如何自定义一个函数对象,并在STL算法中使用。 - 描述STL容器的内存管理和效率特点,比如vector的连续存储和list的跳跃访问。 4. **STL.doc** 另一份全面的STL文档可能详细解释了各个组件的内部工作...

    c++ STL中文版

    1. 容器:STL提供了一组预先定义好的容器类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)等。这些容器可以存储不同类型的数据,并提供了各种操作,如插入、删除、遍历等...

    C++STL集合.pptx

    通过以上介绍,我们可以看到C++ STL集合(set)是一个强大且灵活的数据结构,适用于需要快速查找、排序且不允许重复元素的场景。通过红黑树的内部实现,集合提供了高效的操作性能,使得它成为C++程序员的常用工具之...

    [中英文]STL参考手册

    在实际编程中,STL的使用能显著提升代码的效率,因为它内部的实现通常比手动编写代码更优化。例如,`vector`的插入和删除操作在大多数情况下比原始数组更快,因为它会自动处理内存管理和元素移动。 STL的文档详细...

    彻底学习STL中的Allocator

    任何满足标准中定义的需求集合的类都可以被称为`Allocator`。`std::allocator`是标准库中唯一预定义的`Allocator`类。 - **通用需求集**:这部分在标准文档§20.1.5(表32)中进行了描述,规定了`Allocator`应该具备...

    C++ STL教程pdf

    2. **标准模板**:在C++ STL中,模板被用来定义泛型类(如容器和迭代器)和泛型函数(如算法)。例如,`vector`、`list`、`map`等都是标准模板类,它们可以存储不同类型的数据。模板使代码更加模块化,易于维护和...

    WPF显示STL格式的3D图形.zip

    一旦我们解析了STL文件,我们就可以将这些顶点转换为`MeshGeometry3D`对象,它是WPF中表示3D几何的基本类。 以下是实现步骤的概述: 1. 引入必要的命名空间:为了处理3D图形,我们需要引入`System.Windows.Media....

    SGI STL源码.zip

    STL包含了一系列容器类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(红黑树实现的集合)、map(键值对映射)等。这些容器可以存储不同类型的数据,并提供了方便的插入、删除和访问操作。 2...

    STL程序源代码

    在STL中,容器是存储元素的类模板,如vector用于动态数组,list用于双向链表,set用于有序集合。这些容器提供了插入、删除、遍历元素的方法。迭代器是访问容器中元素的接口,类似于指针,但提供了更多的安全性和便利...

    STL EVC(嵌入式STL)

    `functional`:这个文件包含了函数对象(functors)和函数适配器,如`std::bind`和`std::mem_fn`,它们可以用来封装函数和成员函数,方便在算法中使用。 `type_traits.h`:类型 traits 是 C++11 引入的工具,用于在...

    STL Tutorial and Reference Guide(STL 教程与手册 经典推荐)

    此外,STL还包括了算法的辅助类,如pair(用于存储两个值)、allocator(内存分配器)等。allocator允许你自定义内存管理策略,以适应不同场景的需求。 在学习STL的过程中,你需要掌握以下要点: 1. 理解容器的...

    标准模板库STL

    标准模板库(Standard Template Library,STL)是C++编程语言中的一个重要组成部分,它提供了一组高效、可重用的数据结构和算法。STL的出现极大地提高了C++程序员的开发效率,让代码更加简洁且易于维护。在STL中,...

    STL.rar_STL_STL文件_stl文件教学

    STL文件教学可能涵盖如何创建、编辑、查看和转换STL文件,以及如何在C++编程中使用STL库进行3D模型的处理。 在提供的"STL.ppt"幻灯片教学中,可能涉及以下内容: 1. STL库的介绍,包括其历史和设计目标。 2. 如何在...

    在STL的map或set容器中使用类作为key

    为了在 `set` 或 `map` 中使用类作为key,我们需要定义一个类,并为其提供必要的成员函数。通常,这包括: - **构造函数**: 初始化对象。 - **析构函数**: 清理资源。 - **赋值运算符**: 实现对象间的赋值操作。 - *...

    三十分钟掌握STL----STL学习文档

    在本文档中,我们将深入理解STL的核心概念,帮助你在三十分钟内建立起对STL的基本认知。 首先,STL的一个关键特性是数据结构和算法的分离。这意味着,比如`sort()`函数,可以应用于多种数据集合,如链表、容器和...

Global site tag (gtag.js) - Google Analytics