以前上论坛回答问题的时候曾看到这个问题,现在论坛上不了,正好假期总结,看到以前的代码感觉写得还凑合,就发表了我的第一篇文章。
1,这个版本,把原来的顺序改变了,因为sort 了
----------------------------------------------------------------------------
bool myfunction1 (const char* a, const char* b) {
return !strcmp(a,b);
}
bool myfunction2 (const char* a, const char* b) {
return strcmp(a,b)<0;
}
int main()
{
vector<const char*>myvector;
vector<const char*>::iterator it;
char p[]="i love you do you love me";
char* pch;
pch=strtok(p," ");
while(pch!=NULL)
{
myvector.push_back(pch);
//cout<<pch;
pch=strtok(NULL," ");
}
sort(myvector.begin(), myvector.end(),myfunction2);
cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout<<endl;
it = unique_copy(myvector.begin(), myvector.end(),myvector.begin(),myfunction1);
myvector.resize( it - myvector.begin() ); // 10 20 30 20 10
cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout<<endl;
return 0;
}
2,<vector>;版本压栈的时候查找,如果没有即压栈,有了隔过。----------------------------------------------------------------------------
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
class myfunction1
{
public:
myfunction1(const char* _b){
strcpy(b,_b);
}
bool operator()(const char* a) {
return !strcmp(a,b);
}
private:
char b[20];
};
int main()
{
vector<const char*>myvector;
vector<const char*>::iterator it;
char p[]="i love you do you love me";
char* pch;
pch=strtok(p," ");
myvector.push_back(pch);
while(pch!=NULL)
{
pch=strtok(NULL," ");
if(pch)
{
it=find_if(myvector.begin(),myvector.end(),myfunction1(pch));
if(it==myvector.end())
{
myvector.push_back(pch);
}
}
}
for (it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout<<endl;
return 0;
}
//我发现了c的strtok相当不方便,它分割后的返回值是char *,在内存底部的操作,从而容易导致各种错误。
//要是能够将其转化为string 就好了,存于vector中,拥有随机的迭代器,并且进行两次迭代后,正好可以删除重复。。不过得提供一个
//由char*到string的构造函数,这又是我多么不愿意做的事啊!那样的话,其后它能产生多少意想不到的转换啊,
//scott一再提醒,而我又怎么能置之不理呢。。
3,<list>版本;先全部进栈,在用冒泡式删除前面重复的。。
----------------------------------------------------------------------------
#include "stdafx.h"
#include<iostream>
#include<list>
#include<algorithm>
#include<string>
using namespace std;
bool myfunction1 (const char* a, const char* b) {
return !strcmp(a,b);
}
int main()
{
list<const char*>mylist;
list<const char*>::iterator it;
list<const char*>::iterator it2;
char p[]="i love you do you love me";
char* pch;
pch=strtok(p," ");
while(pch!=NULL)
{
mylist.push_back(pch);
//cout<<pch;
pch=strtok(NULL," ");
}
it=mylist.begin();
it++;
for(;it!=mylist.end();++it)
{
for(it2=mylist.begin();it2!=it;)
if(myfunction1(*it,*it2))
{
mylist.erase(it2++);
}
else
{
++it2;
}
}
for (it=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout<<endl;
return 0;
}
//刚开始的时候,迭代器一直抛除异常,想了一天才发现,尽管在删除it2后
//递增了(保留了迭代器),可是删除it2的同时,也导致了it的失效。。经研究容器改成list
经过这个小练习,首先练习了strtok,其次在例题1中,你可以看到remove或者unique_copy的用法(非常特别的算法)。
最重要是在看了effective stl后,对stl中的vector和list实用后的代码,也就是对迭代器失效的感触。
以后还会写个map 和set的代码。