set判重与map判重(C++)

set判重

    set可以理解为一个不重复且有序的集合,实现原理红黑二叉树。

    一般我们对与set的使用集中在以下几种操作:1.声明或创建set集合 2.插入操作 3.删除操作 4。判断集合中是否有元素 5.返回集合中元素的个数 6.遍历整个集合。

具体代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
//建立 
set<int> intset;
set<string> stringset;
int main(){
	string s1="测试1"; 
	string s2="测试2"; 
	string s3="测试3";
	//插入 
	stringset.insert(s3);
	stringset.insert(s1); 
	//返回集合中元素数量
	cout<<"前两次插入完成后元素的数量:"<<stringset.size()<<endl;
	stringset.insert(s2);
	 cout<<"前三次插入完成后元素的数量:"<<stringset.size()<<endl;
	 //遍历整个集合,借助迭代器实现
	 set<string>::iterator setstringiterator;
	 for(setstringiterator=stringset.begin();setstringiterator!=stringset.end();setstringiterator++){
	 	cout<<*setstringiterator<<" ";
	 } 
	 //删除
	 stringset.erase(s3);
	 cout<<"删除后元素个数为:"<<stringset.size()<<endl; 
	 for(setstringiterator=stringset.begin();setstringiterator!=stringset.end();setstringiterator++){
	 	cout<<*setstringiterator<<" ";
	 } 
	 //判断是否有此元素
	 if(stringset.count(s2)!=0)cout<<"存在元素"<<s2<<endl;
	 return 0; 
}

运行结果:


 map判重

map头文件作用#include<map>

map是一个关联容器,第一个称为关键字(key)每个key只能在map中出现一次。第二个成为该关键字的值(value)。map是以模板的形式实现,可以存储任意类型的数据,map主要用于一对一映射的情况,内部所有的数据都是有序的。

可以把map理解为一个函数,key为自变量,value为因变量,两者一对一映射,通过key来寻找value。所有的元素都是两个值key(键值)value(实值)。

所有元素都会按键值进行排序,属于关联式容器,不允许插入重复的key值

一.构造与赋值

构造:map<int ,int > m;

赋值:m.insert(pair<int,int>(1,10));

具体代码:

#include<iostream>
#include<map> 
using namespace std;
void printmap(map<int ,int>&m){
	for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
		cout<<"key="<<it->first<<"value="<<it->second<<endl;
	}
	cout<<endl;
}
void test01(){
	map<int ,int > m;//创建
	m.insert(pair<int ,int >(1,10));//赋值语句,1起索引作用,10实值 
	m.insert(pair<int ,int >(3,23));
	m.insert(pair<int ,int >(4,34));
	m.insert(pair<int ,int >(2,22));
	printmap(m);
}
int main(){
	test01();
	return 0;
} 

二.大小与交换

size();//返回容器中元素的个数

empty();//判断是否为空

swap(st);//交换两个集合容器

代码实现:

void test02(){
	map<int ,int > m1;//创建
	m1.insert(pair<int ,int >(5,55));//赋值语句,1起索引作用,10实值 
	m1.insert(pair<int ,int >(6,66));
	map<int ,int > m2;
	m2.insert(pair<int ,int >(7,77));
	m2.insert(pair<int ,int >(8,8));
	if(m1.empty()){//判断是否为空 
		cout<<"m为空"<<endl; 
	} else{
		cout<<"m不为空"<<endl; 
		cout<<"m的大小为:"<<m1.size()<<endl; 
	} 
	cout<<"交换前:"<<endl; 
	printmap(m1);
    printmap(m2);
    cout<<"交换后:"<<endl;
    m1.swap(m2);//交换 
    printmap(m1);
    printmap(m2);
}

运行结果:

三.插入和删除

insert(elem);//在容器中插入元素

clear();//清除所有元素

erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器

erase(beg,end);//删除区间元素,返回下一个元素的迭代器

erase(key);//删除值为key的元素

四种插入方式:

	m.insert(pair<int ,int >(1,10));
	m.insert(make_pair(3,23));
	m.insert(map<int,int>::value_type(4,34));
	m[4]=40;//不建议插入,但可以利用key访问value

代码实现:

void test01(){
	map<int ,int > m;//创建
	m.insert(pair<int ,int >(1,10));
	m.insert(make_pair(2,23));
	m.insert(map<int,int>::value_type(4,34));
	m[3]=40;
	printmap(m);
	//删除
	m.erase(3); //删除key为3的数 
	printmap(m);
	m.erase(m.begin());//删除第一个数 
	printmap(m);
}

运行结果: 

四.查找合统计

find(key);//查找key是否存在,若存在,返回改建的元素迭代器,所不存在,返回set.end();

count(key);//由于map不包含重复的key,因此返回值为1或者0,表示包含。

void test03(){
	map<int ,int > m;//创建
	m.insert(pair<int ,int >(1,10));
	m.insert(make_pair(2,23));
	m.insert(map<int,int>::value_type(4,34));
	m[3]=40;
	//查找 
    map<int,int>::iterator pos=m.find(3);
	if(pos!=m.end()){
		cout<<"找到了元素key="<<(*pos).first<<"value="<<pos->second<<endl;
	} else{
		cout<<"未找到"<<endl; 
	}
	//统计
	int num=m.count(3);
	cout<<"num="<<num<<endl;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 `Set<自定义类>` 内部判重通常依赖于两个方法:`hashCode()` 和 `equals()`。 `hashCode()` 方法返回对象的哈希码,它用于确定对象在哈希表中的存储位置。在 `Set` 中,当需要判断两个对象是否相等时,首先会比较它们的哈希码。如果两个对象的哈希码不同,那么它们被认为是不同的对象,不会进行进一步的比较。因此,重写 `hashCode()` 方法是非常重要的。 `equals()` 方法用于比较两个对象是否相等。在 `Set` 中,当两个对象的哈希码相同(即可能是同一个存储位置),会进一步调用 `equals()` 方法来比较它们的实际内容。如果 `equals()` 方法返回 `true`,则判定这两个对象是相等的,重复元素将不会被添加到 `Set` 中。因此,也需要正确地重写 `equals()` 方法。 要确保 `Set<自定义类>` 内部能够正确判重,需要满足以下条件: 1. 重写 `hashCode()` 方法:确保相等的对象具有相同的哈希码。 2. 重写 `equals()` 方法:确保相等的对象返回 `true`。 同时,还应该遵循以下约定: 1. 如果两个对象相等(即 `equals()` 返回 `true`),则它们的哈希码必须相等。 2. 如果两个对象的哈希码相等,它们并不一定相等(即 `equals()` 返回 `false`),这种情况被称为哈希冲突。 具体的实现方式会根据自定义类的属性和业务逻辑而有所不同,一般来说,需要根据对象的某些属性来计算哈希码,并在 `equals()` 方法中比较这些属性的值是否相等。 下面是一个示例,假设自定义类为 `Person`,它有一个属性 `id`: ```java public class Person { private int id; // 其他属性和方法... @Override public int hashCode() { return Objects.hash(id); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Person other = (Person) obj; return id == other.id; } } ``` 在上述示例中,我们通过重写 `hashCode()` 方法使用 `Objects.hash()` 方法计算哈希码,使用 `id` 属性进行比较。在 `equals()` 方法中,首先判断两个对象是否为同一个引用,然后判断类别是否相同,最后比较 `id` 属性的值。 通过正确实现 `hashCode()` 和 `equals()` 方法,就可以确保 `Set<自定义类>` 内部能够正确判重

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怼您恏1031

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值