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。

发布了16 篇原创文章 · 获赞 4 · 访问量 474

猜你喜欢

转载自blog.csdn.net/benobug/article/details/104941448