1.前言
set容器是C++ STL中的容器之一,set容器有以下几个显著的特点:(1)set中的元素的值是唯一的;(2)set的元素是按照特定的顺序进行排列的,默认情况下是按照升序进行排列的;(3)set中的元素不能够被修改,可以通过删除操作将元素删除;C++ stl中的关联容器:map,set,multiset,multimap内部的数据结构为红黑树(RB树)。
2.set的操作
(1)set的所有操作
(2)选取常用的函数进行分析
#include <iostream>
#include <set>
#include <utility>
#include <iomanip>
using namespace std;
bool fcomp(int x1,int x2){
return x1<x2;
}
struct classcomp
{
bool operator()(const int &lhs,const int& rhs) const{
return lhs>rhs;
}
};
//f_construct()函数着重介绍set的构造函数
void f_construct(){
//默认构造函数 explicit set (const key_compare& comp = key_compare(),
// const allocator_type& alloc = allocator_type());
set<int> first;
int myints[]={20,10,30,40,50};
//范围 set (InputIterator first, InputIterator last,
// const key_compare& comp = key_compare(),
// const allocator_type& = allocator_type());
set<int> second(myints,myints+5);
//赋值 set (const set& x);
set<int> third(second);
set<int> fourth(second.begin(),second.end()); //迭代器的范围
set<int,classcomp> fifth(second.begin(),second.end()); //迭代器的范围
cout<<"second(set 中默认升序排列):";
for (set<int>::iterator iter=second.begin();iter!=second.end();iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
cout<<"fifth(通过自定义set的比较函数,来明确set中集合的顺序):";
for (set<int,classcomp>::iterator iter=fifth.begin();iter!=fifth.end();iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
bool(*f_pt)(int,int)=fcomp;
set<int,bool(*)(int,int)> sixth(f_pt);
sixth.insert(myints,myints+5);
cout<<"sixth :";
for (set<int,bool(*)(int,int)>::iterator iter=sixth.begin();iter!=sixth.end();iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
}
//f_insert()函数着重介绍set的insert操作;
void f_insert(){
set<int> myset;
typedef set<int>::iterator iterType;
iterType iter1;
pair<set<int>::iterator ,bool> ret;
//initializer list (1) 直接插入单个元素用来初始化set
//void insert (initializer_list<value_type> il);
for (int i=1;i<=10;i++) //初始化set中的elements
{
myset.insert(i);
}
//single element(2)
//pair<iterator,bool> insert (const value_type& val);
//pair<iterator,bool> insert (value_type&& val);
ret=myset.insert(5); // 未插入新元素
if (ret.second==false)
{
iter1=ret.first;
} //iter1当前指向元素5
//with hint (3)通过固定的指针位置插入元素
//iterator insert (const_iterator position, const value_type& val);
//iterator insert (const_iterator position, value_type&& val);
myset.insert(myset.begin(),11);
myset.insert(myset.end(),12);
int a[]={13,14,15,10,9}; //插入myset中的元素实际为13,14,15
//range (4) 通过指针的范围插入新元素
//template <class InputIterator>
//void insert (InputIterator first, InputIterator last);
myset.insert(a,a+5);
cout<<"myset :";
for (iterType iter=myset.begin();iter!=myset.end();iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
}
//f_size_empty_max_size()函数着重介绍set的size、empty 、max_size函数;
void f_size_empty_max_size(){
int a[]={1,2,4,5};
set<int> first(a,a+4);
//bool empty() const noexcept
//判断set是否为空
cout << "myset contains:";
while (!first.empty())
{
std::cout << ' ' << *first.begin();
first.erase(first.begin());
}
cout<<endl;
//size_type size() const noexcept;
//求set中元素的个数
cout<<"first 中元素的个数:"<<first.size()<<endl;
//size_type max_size() const noexcept;
//max_size返回set中最多能够容纳的元素的个数
cout<<"first 中最多能够容纳元素的个数:"<<first.max_size()<<endl;
}
// f_iteratorOperations()函数着重介绍set中的迭代器操作,包括:begin(),end(),rbegin(),rend();
void f_iteratorOperations(){
int myints[] = {75,23,65,42,13};
std::set<int> firstSet (myints,myints+5);
//通过begin和end返回指向set集合中的第一个元素的迭代器,和返回最后一个元素的下一个元素的迭代器。
std::cout << "顺序遍历set集合中的每一个元素,结果如下:"<<endl;
for (set<int>::iterator iter=firstSet.begin();iter!=firstSet.end();iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
//通过rbegin和rend返回指向set集合中的最后一个元素的迭代器,和返回第一个元素之前的元素的迭代器
std::cout << "反序遍历set集合中的每一个元素,结果如下:"<<endl;
for (set<int>::reverse_iterator iter=firstSet.rbegin();iter!=firstSet.rend();iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
}
//f_find_count()函数着重介绍set的find和count操作;
void f_find_count(){
int myints[] = {75,23,65,42,13};
std::set<int> firstSet (myints,myints+5);
//iterator find (const value_type& val) const;
//find()函数如果找到了val元素则返回指向val的迭代器,否则返回set::end;
set<int>::iterator iterVal23=firstSet.find(23);//iterVal是指向23的迭代器
set<int>::iterator iterVal99=firstSet.find(99);//set集合中没有99这个元素,所以iterVal99为firstSet.end();
firstSet.erase(iterVal23);//从firstSet中删除iterVal23所指向的元素
std::cout << "firstSet contains:";
for (set<int>::iterator it=firstSet.begin(); it!=firstSet.end(); ++it)
std::cout << ' ' << *it;
cout<<endl;
//size_type count (const value_type& val) const;
//count()函数返回set中值为val的元素的个数
set<int>::size_type num22=firstSet.count(22);
cout<<"firstSet中值为22的元素的数目:"<<num22<<endl;
}
//f_keyCpmpare_valueCompare()函数着重介绍set的key_comp()函数和value_comp()函数;
void f_keyCpmpare_valueCompare(){
int myints[] = {75,23,65,42,13};
std::set<int> myset(myints,myints+5);
int highest;
//key_compare key_comp() const;
set<int>::key_compare mycomp = myset.key_comp();
//key_compare key_comp() const;
set<int>::value_compare mycomp1= myset.key_comp();
std::cout << "myset contains:";
highest=*myset.rbegin();
std::set<int>::iterator it=myset.begin();
do {
std::cout << ' ' << *it;
} while ( mycomp(*(++it),highest) );
std::cout << '\n';
}
//f_erease()函数着重介绍set的erease操作()
void f_erease(){
int myints[] = {75,23,65,42,13};
std::set<int> myset(myints,myints+5);
cout<<"顺序遍历myset中元素的结果:"<<endl;
for (set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
std::cout << ' ' << *it;
cout<<endl;
//(1) size_type erase (const value_type& val);
//删除值为val的元素
myset.erase(75);
//(2) void erase (iterator position);
//删除迭代器position所指向的元素
myset.erase(myset.begin());
//void erase (iterator first, iterator last);
//删除first,last迭代器之间的元素
myset.erase(myset.begin(),myset.begin()); // 未删除任何元素
cout<<"删除部分元素之后set中的元素:"<<endl;
for (set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
std::cout << ' ' << *it;
cout<<endl;
}
int main(){
cout<<setfill('*')<<setw(50)<<"f_construct():"<<endl;
f_construct();
cout<<setfill('*')<<setw(50)<<"f_erease():"<<endl;
f_erease();
cout<<setfill('*')<<setw(50)<<"f_find_count():"<<endl;
f_find_count();
cout<<setfill('*')<<setw(50)<<"f_insert():"<<endl;
f_insert();
cout<<setfill('*')<<setw(50)<<"f_iteratorOperations():"<<endl;
f_iteratorOperations();
cout<<setfill('*')<<setw(50)<<"f_keyCpmpare_valueCompare():"<<endl;
f_keyCpmpare_valueCompare();
cout<<setfill('*')<<setw(50)<<"f_size_empty_max_size():"<<endl;
f_size_empty_max_size();
}

版权声明:本文为pitaya_lei原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。