前面写过一篇利用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。