从Vector删除重复项

最近在做作业的时候碰到了这么一个问题:

读入一系列字符串,等于Quit时停止输入。要求,输出这个字符串序列两次。如果有重复项,则不输出重复

项,第一次保留原来录入的顺序,第二次对序列进行排序后输出。

考虑到Vector比较容易操作,就打算用vector存了,然后就遇到了下面的困难:

(1).原顺序的情况下,即保留输入顺序的情况下,怎么才能不输出重复项呢?

(2).在排序后的情况下,怎么才能不输出重复项呢?

其实第二种情况比较好操作,直接用sort函数对vector进行排序,再使用unique函数,就可以实现重复想的删除,得到预期目的。

麻烦的是第一种,起初以为两种情况是一种解法,就是直接用unique函数,错了半天才发现,原来unique函数是删除那些相邻项

的重复项,未排序时完全不起作用,头疼了好半天,查了半天书,最后终于想出了一个解决的办法,反正C++算法库里没有直接的

解决办法,(楼主以为有的,额)。所以自己写了一个函数,完成了这个功能,下面分别上两个代码,大家看看。

解决方案一:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main()
{
	using namespace std;
	vector<string> svec;
	string str;
	
	while(cin >> str)
	{
		if(str == "Quit")
			break;
		svec.push_back(str);
	}
	
	typedef vector<string>::iterator iter_type;
	
	iter_type it, ret, begin = svec.begin();
	for(it = ++svec.begin(); it != svec.end();)//这里是去除重复的部分,就是一个个遍历,如有相同,则只保留一个
	{
		ret = find(begin, it, *it);
		if(ret != it)
			svec.erase(it);
		else	
			++it;
	}
	
	iter_type fir = svec.begin();
	while(fir != svec.end())
	{
		cout << *fir << " ";
		++fir;
	}
	return 0;
}


解决方案二:这个easy,没什么可说的,现有的东西直接用就行了,

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
	using namespace std;
	vector<string> svec;
	string str;
	
	while(cin >> str)
	{
		if(str == "Quit")
			break;
		svec.push_back(str);
	}
	
	sort(svec.begin(), svec.end());
	typedef vector<string>::iterator iter_type;
	iter_type end_unique = unique(svec.begin(), svec.end());
	iter_type it = svec.begin();
	
	while(it != end_unique)
	{
		cout << *it << " ";
		++it;
	}
	return 0;
}

这里做个笔记,以后翻起来就简单了,虽然这个不怎么难~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值