最近在做作业的时候碰到了这么一个问题:
读入一系列字符串,等于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;
}
这里做个笔记,以后翻起来就简单了,虽然这个不怎么难~