i love you do you love me

哈哈,颇有标题党之嫌。其实是以前写过的c++程序,今天贴出来:在“i love you do you love me”字符串中删除重复的单词(loveyou)。

如果你在学习stl,那么有必要好好看看。

这个版本,把原来的顺序改变了,因为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>;版本压入的时候查找,如果没有即压栈,有了隔过。


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


原文地址:https://www.cnblogs.com/dmesg/p/1546903.html