c++ STL 之 set及multiset

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013919153/article/details/82454547

/**
template < class T,             // set::key_type/value_type
class Compare = less<T>,        // set::key_compare/value_compare
class Alloc = allocator<T>      // set::allocator_type
		 > class set;
**/


#define VNAME(value) {cout<<(#value)<<":"<<endl;}

template<class T>
void print_elemnt(T &v)
{
	for(auto i : v)
		cout<<i<<" ";
	cout<<endl;
}


bool fncomp (int lhs, int rhs) {return lhs<rhs;}

struct classcomp {
	bool operator() (const int& lhs, const int& rhs) const
	{return lhs<rhs;}
};
void test_set(){
	//关于构造函数,可以指定比较函数,内存分配函数,区间赋值,拷贝构造
	set<int,classcomp> a;
	set<int> b;
	set<int> c(b);
	//set<int> d(c.begin(),c.end());
	//set<int> e(fncomp);
	
	/**
	 迭代器:begin,end,rbegin,rend及对应的const
	 set的迭代器不能与整数进行加操作,因为内存不是连续的,底层实现红黑树
	 **/

	//a.size();
	//a.max_size();
	if (a.empty())
	{
		cout<<"a is empty."<<endl;
	}

	//返回值为pair<iterator,bool>,存在导致插入失败
	auto i = a.insert(2);
	cout<<"a insert 2 result:"<<i.second<<endl;
	a.insert(4);
	a.insert(7);
	a.insert(a.begin(),3);
	c.insert(a.begin(),a.end());

	//b.emplace(1,2,3,4);	//错误,一次只能插入一个元素
	b.emplace(6);
	b.emplace_hint(b.cend(),9);	//指定位置插入一个值,插入数据就会排序,所以没啥用感觉

	VNAME(b)
	print_elemnt(b);

	a.erase(a.begin());		//删除具体某个位置的值,返回删除最后一个元素的下一个元素的迭代器
	a.erase(7);				//删除值,返回为删除的个数,这里为0或者1
	//a.erase(first,last);	//删除一段区间

	cout<<"size of a:"<<a.size()<<endl;
	cout<<"max_size of a :"<<a.max_size()<<endl;

	b.swap(c);		//交换内容
	VNAME(b)
	print_elemnt(b);

	//a.key_comp();			//返回键比较函数
	//a.value_comp();		//返回值比较函数
	auto key_iter = a.find(1);	//得到一个值所对应迭代器。不存在返回set::end()
	auto num = a.count(1);		//计算一个值出现次数,这里为0或者1

	//说明:默认情况下lower_bound返回该元素的迭代器,
	// upper_bound返回该元素下一个元素的迭代器
	// 如果指定比较函数,lower_bound则返回comp(element,val) return false 对应元素的迭代器
	// upper_bound则返回key_comp(val,element) return true的元素的迭代器
	auto low = a.lower_bound(2);
	auto high = a.upper_bound(3);	//一般这两个值配合erase删除一段区间
	auto range = a.equal_range(3);	//返回值等于某一值的区间范围,用于multiset。区间为[,)
	cout<<"lower_bound :"<<*range.first<<endl;
	cout<<"upper_bound :"<<*range.second<<endl;

	b.clear();				//清空内容

	VNAME(a)
	print_elemnt(a);
	VNAME(c)
	print_elemnt(c);
	VNAME(b)
	print_elemnt(b);

	a.insert(2);
	a.insert(1);
	a.insert(5);

	for (auto iter_i = a.begin(); iter_i != a.end();)
	{
		cout<<*iter_i<<" ";
		if (*iter_i == 2)
		{
			//a.erase(iter_i++);
			iter_i = a.erase(iter_i);
			/*这里说明下,为什么顺序容器中必须赋值给迭代器,而不能使用自增的原因
			 *关联容器删除之后只是该元素对应的迭代器失效,而顺序容器删除一个元素后,后面所有元素的迭代器都失效
			 */
		}else
		{
			iter_i++;
		}
	}

	cout<<endl;
	print_elemnt(a);

	/**
	 **multiset和set功能函数类似,只不过multiset允许重复值存在
	 **/
	multiset<int> Mula;
	Mula.insert(1);
	Mula.insert(2);
	Mula.insert(3);
	Mula.insert(1);
	Mula.insert(2);

	auto it = Mula.find(1);		//返回第一个值相等元素的迭代器,也即比较函数返回false时的直对应的迭代器
	it++;
	cout<<" 1 pos "<<*it<<endl;
	//可以使用equal_range获取相同值的范围

	VNAME(Mula)
	print_elemnt(Mula);

	cout<<endl<<endl;
}

猜你喜欢

转载自blog.csdn.net/u013919153/article/details/82454547
今日推荐