C++利用查找表删除重复元素

前面写过一篇利用C++STL自带的unique函数删除重复元素的方法,不过unique只能用于删除邻近重复的元素,对于无序的元素序列,则需要事先进行排序,但这会破坏元素的顺序,在有些情况下不可取,所以本篇介绍利用map(或者unordered_map)来实现删除重复元素的方法。话不多说,直接上代码

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main()
{
	string str;			// 不局限于string,可以是其他容器
	while (cin >> str)
	{
		// 生成查找表
		unordered_map<char, bool> search_table;
		auto iter = str.begin();
		while (iter != str.end())		// 遍历容器
		{
			if (search_table[*iter])   // 如果在表中已存在
				iter = str.erase(iter);  // 删除该元素
			else						// 如果表中没有该元素
			{
				search_table[*iter] = true;  // 在表中插入元素,设置为true
				iter++;
			}			
		}
		cout << str << endl;
	}

	return 0;
}

这里解释一下if语句
查找* iter时,先在search_table中查找主键为* iter的项,如果没发现,将生成一个新的对象插入search_table中,键是* iter,插入完成后,会将键值都赋为缺省值,这里bool的缺省值为false。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值