C++ STL (1)set容器用法、操作详细介绍

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版权协议,转载请附上原文出处链接和本声明。