C++基础:C++标准库之set简介

1、综述

set是C++STL中众多的Container(容器)之一,用于储存数据并且能从一个数据集合中取出数据,它的每个元素的值必须惟一。set内部通过自建红黑树(一种非严格意义上的平衡二叉树)实现,可以对数据自动排序。构造set集合主要目的是为了快速检索,不可直接去修改键值。

2、set的常见操作

首先,在使用map之前需包含头文件#include<set>,下面简要介绍map的常见操作,详细信息可参见http://www.cplusplus.com/reference/set/set/

(1)构造函数:

构造函数有多种实现形式,如下举例:

set<int> Myset1;
int Myint[] = {2,4,6,8,10};
set<int> Myset2(Myint,Myint+5);
set<int> Myset3(Myset2);
set<int> Myset4(Myset2.begin(),Myset2.end());

示例中int是set中数据类型,可以为其他类型,如char,float。
    
(2)插入数据:

for (int i=1; i<=5; ++i) //插入1 2 3 4 5
Myset1.insert(i);
int Myint3[] = {3,6,9,12,15};
Myset3.insert(Myint3,Myint3+5);

(3)查找元素:

利用find()方法,find()函数返回一个对应查找值迭代器,如果没找到就返回指向set尾部的迭代器。

set<int>::iterator itr;//迭代器itr = Myset1.find(3);//查找2
if(itr!= Myset1.end())
cout<<"在Myset1找到元素3!"<<endl;
else
cout<<"在Myset1找不到元素3!"<<endl;

(4)元素遍历:

利用迭代器实现,也可以进行逆向遍历。示例如下:


cout<<"\nMyset1中元素内容如下:"<<endl;
for(itr = Myset1.begin();itr!=Myset1.end();itr++)
cout<<*itr<<" ";
cout<<"\nMyset4中元素内容如下:"<<endl;
itr = Myset4.begin();
while(itr != Myset4.end())
cout<<*itr ++ << " ";
//逆向遍历Myset4
cout<<"\nMyset4逆向遍历结果如下:"<<endl;
set<int>::reverse_iterator itr2 = Myset4.rbegin();
while(itr2 != Myset4.rend())
cout<<*itr2++ << " ";
cout<<endl;

(5)元素删除:

采用erase()方法实现:


for(int i = 1;i<=5;i++)
Myset3.erase(i*2);
//或者用itr删除,
itr = Myset4.begin();
itr ++;//此时itr指向第二个元素
Myset4.erase(itr);
//删除多个元素
itr = Myset4.find(6);
Myset4.erase(itr,Myset4.end());

(6)swap()方法:

实现的是对两个set的整体交换。

Myset1.swap(Myset2);

(7)size()方法:
         
返回set的大小,即元素的个数。
        (8)empty()方法

         
判断map是否为空,若map为空,则返回true。
       
(9)begin()方法:
         
返回指向map头部的迭代器
        (10)end()方法:

          返回指向map尾部的迭代器

       (11)clear()方法:

          清除整个set的内容

3、常见操作程序示例


#include<iostream>
#include<set>
using namespace std;
void test_set()
{
//四种构造函数形式举例
set<int> Myset1;
int Myint2[] = {2,4,6,8,10};
set<int> Myset2(Myint2,Myint2 + 5);
set<int> Myset3(Myset2);
set<int> Myset4(Myset2.begin(),Myset2.end());

//插入数据
for (int i=1; i<=5; ++i) //插入1 2 3 4 5
Myset1.insert(i);
int Myint3[] = {3,15,9,6,12};//尽管数组本身,但插入set之后是有序的,且注意对于重复元素(6)是不能重复插入的
Myset3.insert(Myint3,Myint3+5);

//查找操作
set<int>::iterator itr;//迭代器
itr = Myset1.find(3);//查找2
if(itr!= Myset1.end())
cout<<"在Myset1找到元素3!"<<endl;
else
cout<<"在Myset1找不到元素3!"<<endl;

//元素遍历,两种形式
cout<<"\nMyset1中元素内容如下:"<<endl;
for(itr = Myset1.begin();itr!=Myset1.end();itr++)
cout<<*itr<<" ";
cout<<"\nMyset2中元素内容如下:"<<endl;
for(itr = Myset2.begin();itr!=Myset2.end();itr++)
cout<<*itr<<" ";
cout<<"\nMyset3中元素内容如下:"<<endl;
for(itr = Myset3.begin();itr!=Myset3.end();itr++)
cout<<*itr<<" ";
cout<<"\nMyset4中元素内容如下:"<<endl;
itr = Myset4.begin();
while(itr != Myset4.end())
cout<<*itr ++ << " ";
//逆向遍历Myset4
cout<<"\nMyset4逆向遍历结果如下:"<<endl;
set<int>::reverse_iterator itr2 = Myset4.rbegin();
while(itr2 != Myset4.rend())
cout<<*itr2++ << " ";
cout<<endl;

//删除操作
for(int i = 1;i<=5;i++)
Myset3.erase(i*2);
cout<<"\nMyset3删除元素之后内容如下:"<<endl;
for(itr = Myset3.begin();itr!=Myset3.end();itr++)
cout<<*itr<<" ";
//或者用itr删除,
itr = Myset4.begin();
itr ++;//此时itr指向4
Myset4.erase(itr);
cout<<"\nMyset4删除元素之后内容如下:"<<endl;
for(itr = Myset4.begin();itr!=Myset4.end();itr++)
cout<<*itr<<" ";
itr = Myset4.find(6);
Myset4.erase(itr,Myset4.end());
cout<<"\nMyset4再次删除元素之后内容如下:"<<endl;
for(itr = Myset4.begin();itr!=Myset4.end();itr++)
cout<<*itr<<" ";

//交换
Myset1.swap(Myset2);
cout<<"Myset1与Myset2进行交换"<<endl;
cout<<"\n交换后Myset1内容如下:"<<endl;
for(itr = Myset1.begin();itr!=Myset1.end();itr++)
cout<<*itr<<" ";
cout<<"\n交换后Myset2内容如下:"<<endl;
for(itr = Myset2.begin();itr!=Myset2.end();itr++)
cout<<*itr<<" ";
cout<<endl;

//清除与求大小
cout<<"\nMyset1大小为:"<<Myset1.size()<<endl;
Myset1.clear();
cout<<"clear()清除Myset1的所有元素后大小为"<<Myset1.size()<<endl;
}

时间: 2024-12-12 17:42:04

C++基础:C++标准库之set简介的相关文章

C++基础:C++标准库之map简介

1.综述 Map是C++STL中众多的Container(容器)之一,与python的字典略类似,Map作为一个关联容器,将key与value相互关联,其中key为关键字,是不可更改的,而value是key值的相对应值.Map所提供的一对一的数据映射关系,在很多时候可以提供编程的极大便利. Map内部通过自建红黑树(一种非严格意义上的平衡二叉树)实现,可以对数据自动排序,因而在map内部的所有数据是有序存放的.Map具有的一大特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点

C 标准库 - &lt;stdarg.h&gt;

C 标准库 - <stdarg.h> 简介 stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数. 可变参数的函数通在参数列表的末尾是使用省略号(,...)定义的. 库变量 下面是头文件 stdarg.h 中定义的变量类型: 序号 变量 & 描述 1 va_list 这是一个适用于 va_start().va_arg() 和 va_end() 这三个宏存储信息的类型. 库宏 下面是头文件 stdarg.h

C 标准库 - &lt;string.h&gt;

C 标准库 - <string.h> 简介 string .h 头文件定义了一个变量类型.一个宏和各种操作字符数组的函数. 库变量 下面是头文件 string.h 中定义的变量类型: 序号 变量 & 描述 1 size_t 这是无符号整数类型,它是 sizeof 关键字的结果. 库宏 下面是头文件 string.h 中定义的宏: 序号 宏 & 描述 1 NULL这个宏是一个空指针常量的值. 库函数 下面是头文件 string.h 中定义的函数: 序号 函数 & 描述 1

python linecache标准库基础学习

#python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件读取多行文本;此模块会在python标准库的其他部分中用到,缓存实现将在内存中保存文件内容(解析为单独的行).API通过索引一个列表返回所请求的行.与反复地读取文件并解析文本来查找所需文本行相比,这样可以节省时间,这个方法在查找同一个文件中多行尤其有用 ,比如一个异常."""im

python calendar标准库基础学习

# -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calendarc=calendar.TextCalendar(calendar.SUNDAY)c.prmonth(2015,3)#prmonth()简单函数,生成一个月的格式文件输出#TextCalendar()从星期天(为第一天,因为老外是从星期天开始算第一天的)#利用HTMLCalendar和forma

《Python基础教程(第二版)》学习笔记 -&gt; 第十章 充电时刻 之 标准库

SYS sys这个模块让你能够访问与Python解释器联系紧密的变量和函数,下面是一些sys模块中重要的函数和变量: 函数和变量 描述 argv 命令行参数,包括脚本和名称 exit([arg])                退出当前的程序,可选参数为给定的返回值或者错误信息 modules 映射模块名字到载入模块的字典 path 查找模块所在目录的目录名列表 platform 平台标识符 stdin 标准输入流-- 一个类文件对象 stdout 标准输出流-- 一个类文件对象 stderr

【夯实PHP基础】PHP标准库 SPL

PHP SPL笔记 这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 由于这是供自己参考的笔记,不是教程,所以写得比较简单,没有多解释.但是我想,如果你是一个熟练的PHP5程序员,应该足以看懂下面的材料,而且会发现它很有用.现在除此之外,网上根本没有任何深入的SPL中文介绍. ================ PHP SPL笔记 目录 第一部分 简介 1. 什么是SPL? 2.

python基础教程_学习笔记15:标准库:一些最爱——fileinput

标准库:一些最爱 fileinput 重要的函数 函数 描述 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 lineno() 返回当前(累计)的名称 filelineno() 返回当前文件的行数 isfirstline() 检查当前行是否是文件的第一行 isstdin() 检查最后一行是否来自sys.stdin nextfile() 关闭当前文件,移动到下一个文件 close() 关闭序列 fileinput

python基础教程_学习笔记16:标准库:一些最爱——random

标准库:一些最爱 random random模块包括返回随机数的函数,可以用于模拟或者用于任何产生随机输出的程序. 事实上,所产生的数字都是伪随机数,它们以一个可预测的系统作为基础,除非是为了强加密的目标,否则这些随机数还是足够随机的.如果真的需要随机性,可以使用os模块的urandom函数. 重要函数 函数 描述 random() 返回0<=n<1之间的随机实数n,其中0<n<=1 getrandbits(n) 以长整型形式返回n个随机位(二进制数) uniform(a,b) 返