stl-set

set是一个能储存单键的容器;

它最大的特性就是那个键最多出现一次;

set有很多操作

1.构造

2.插入

3.遍历

4.查找和读取

5.删除

#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<iostream>
#include<set>
#define mmset(a,b) memset(a,sizeof(b),a);
using namespace std;

int main()
{
    set <string> data;        //1.构造键类型为string的一个set容器
    
    //2.插入
    data.insert("ddd");		//在容器内部并不是按照插入的顺序排序的,而是 
    data.insert("eee");		//按照关键字从小到大排序的 
    data.insert("aaa");
    data.insert("bbb");
    data.insert("ccc");
    ;
    //3.遍历
    
    //正向遍历 
	set <string> ::iterator iter;
	for(iter = data.begin(); iter != data.end(); iter++)
	{
		cout<<*iter<<endl;	//迭代器iter可以当做指针, 所以在输出值
							//之前要解引用 
	} 
    //反向遍历
	set <string>:: reverse_iterator riter;
	for(riter= data.rbegin(); riter != data.rend(); riter++)
	{
		cout<<*riter<<endl;
	}
	
	//4.查找和读取
	//查找 
	cout<<data.count("aaa") <<endl;		//若存在查找的值输出1,不存在输出0 
	cout<<data.count("ccc")<<endl;
	//读取
	cout<<*(data.find("aaa"))<<endl;	//find返回带查找的值在容器内的迭代器
										//若不存在程序会崩溃
	
	//5.删除
	data.erase(data.find("aaa"));		//删除数据"aaa" 
	data.erase(data.begin(),data.end());//把迭代器从begin到end之间的内容全部清除 

    
    return 0;
}

需要的是这里的data.end()并不是最后一个元素,而是最后一个元素之后的一个起到结束标志的迭代器;

data.erase(iter1,iter2)删除的是[iter1,iter2)的内容,并不包括iter2;

set自定义去重和自定义排序

#include<stdio.h>
#include<string>
#include<iostream>
#include<set>
#include<algorithm>
#define ll long long 
#define mmset(a,b) memset(a,b,sizeof(a))
#define iter set<node>::iterator
#define riter set<node>::reverse_iterator
using namespace std;
struct node 
{
	int x,y;
	node()
	{
	}
	node (int px, int py)
	{
		x = px;
		y = py;
	}
	bool operator < (const node b) const //重载< 
	{
	  	if(x!=b.x)
	  	{
	  		return x<b.x;
	  	}
	  	else
	  	{
	   		return y<b.y;
	  	}

	}
};
int main()
{
	set<node> data;
	data.insert(node(1,2));
	data.insert(node(1,3));
	data.insert(node(1,4));
	data.insert(node(4,2));
	data.insert(node(2,2));
	data.insert(node(3,3));
	data.insert(node(5,5));
	data.insert(node(7,1));
	data.insert(node(9,2));
	for(iter i = data.begin(); i != data.end(); i++)
	{
		cout<<i->x<<" "<<i->y<<endl;
	}
	


	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值