以前上论坛回答问题的时候曾看到这个问题,现在论坛上不了,正好假期总结,看到以前的代码感觉写得还凑合,就发表了我的第一篇文章。

 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的代码。