【C++ STL】细数C++ STL 的那些事---set(元素唯一,且排序)

2024-04-05 01:48

本文主要是介绍【C++ STL】细数C++ STL 的那些事---set(元素唯一,且排序),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据。它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序。每个元素的值不能直接被改变。

        【重点】内部结构采用红黑树的平衡二叉树

              multiset 跟set 类似,唯一的区别是允许键值重复!!!

        2)使用

                    需加载的头文件:   #include<set>
                                          using namespace std;

                     template<

                                     class  Key,            //存储在容器中的关键字类型

                                     class  Compare=less<Key>, //比较两个元素的函数来决定在Set中位置(可选)

                                     class  Allocator=allocator<Key>  //代表存储管理设备(可选)

                                     >

        3)特点

                  1>关联容器,大小可以改变,根据关键字值来提高读取数据的能力。

                  2>提供一个双向定位器来读写数据。

                  3>根据关键字和一个比较函数来排好序

                  4>关键字唯一


         4)资源

                         STL 中Set详细介绍


         5)函数

              1>begin() 返回指向第一个元素的迭代器
              2>clear() 清除所有元素
              3>count() 返回某个值元素的个数

              4>empty() 如果集合为空,返回true
              5>end() 返回指向最后一个元素的迭代器


              6>equal_range() 返回第一个>=关键字的迭代器和>关键字的迭代器
              语法:
                   pair <iterator,iterator>equal_range( const key_type &key );//key是用于排序的关键字
                   Set<int> ctr;
              例如:
                   Pair<set<int>::iterator,set<int>::iterarot>p;
                   For(i=0;i<=5;i++) ctr.insert(i);
                   P=ctr.equal_range(2);
                   那么*p.first==2;*p.second==3;


             7>erase() 删除集合中的元素
             语法:
                  iterator erase( iterator i ); //删除i位置元素,返回第一个不被删除的双向定位器,不存在返回末尾
                  iterator erase( iterator start, iterator end );//删除从start开始到end(end为第一个不被删除的值)结束的元素
                  size_type erase( const key_type &key );//删除等于key值的所有元素(返回被删除的元素的个数)


            8>find() 返回一个指向被查找到元素的迭代器
               语法:
                   iterator find( const key_type &key );//查找等于key值的元素,并返回指向该元素的迭代器;如果没有找到,返回指向集合最后一个元素的迭代器
             9>get_allocator() 返回集合的分配器
            10>insert() 在集合中插入元素
               语法:
                   iterator insert( iterator i, const TYPE &val ); //在迭代器i前插入val
                   void insert( input_iterator start, input_iterator end );//将迭代器start开始到end(end不被插入)结束返回内的元素插入到集合中
                   pair insert( const TYPE &val );//插入val元素,返回指向该元素的迭代器和一个布尔值来,注意不能插入两个相同的元素


            11>lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
              语法:
                   iterator lower_bound( const key_type &key );//返回一个指向大于或者等于key值的第一个元素的迭代器


            12>key_comp() 返回一个用于元素间值比较的函数
             语法:
                   key_compare key_comp();//返回一个用于元素间值比较的函数对象

            13>max_size() 返回集合能容纳的元素的最大限值

            14>rbegin() 返回指向集合中最后一个元素的反向迭代器
             示例:
                  Set<int> ctr;
                  Set<int>::reverse_iterator rcp;
                  For(rcp=ctr.rbegin();rcp!=ctr.rend();rcp++)
                  Cout<<*rcp<<” ”;


            15>rend() 返回指向集合中第一个元素的反向迭代器
            16>size() 集合中元素的数目
            17>swap() 交换两个集合变量
              语法:
                   void swap( set &object ); //交换当前集合和object集合中的元素
            18>upper_bound() 返回大于某个值元素的迭代器
              语法:
                   iterator upwer_bound( const key_type &key );//返回一个指向大于key值的第一个元素的迭代器
            19>value_comp() 返回一个用于比较元素间的值的函数
              语法:
                   iterator upper_bound( const key_type &key );//返回一个用于比较元素间的值的函数对象

            6)示例

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;int main(int argc, char** argv) {int i;int ia[5]={1,2,3,4,5};set<int> iset(ia,ia+5);cout<<"size="<<iset.size()<<"; count of 3 ="<<iset.count(3)<<endl;iset.insert(3); //不会插入重复的值cout<<"size="<<iset.size()<<"; after insert 3 count of 3 ="<<iset.count(3)<<endl;iset.insert(6);cout<<"after insert 6 size="<<iset.size()<<endl;iset.erase(1);cout<<"after erase 1 size="<<iset.size()<<"count of 1 ="<<iset.count(1)<<endl;set<int>::iterator ite1=iset.begin();set<int>::iterator ite2=iset.end();for(;ite1!=ite2;ite1++)cout<<*ite1<<" ";cout<<endl;//使用STL的find来搜寻元素ite1=find(iset.begin(),iset.end(),2);if(ite1!=iset.end())cout<<"2 found"<<endl;elsecout<<"2 not found"<<endl;//使用set 提供的find函数ite1=iset.find(8);if(ite1!=iset.end())cout<<"8 found"<<endl;elsecout<<"8 not found"<<endl;return 0;
}

size=5; count of 3 =1
size=5; after insert 3 count of 3 =1
after insert 6 size=6
after erase 1 size=5count of 1 =0
2 3 4 5 6
2 found
8 not found


这篇关于【C++ STL】细数C++ STL 的那些事---set(元素唯一,且排序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877366

相关文章

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程