zoukankan      html  css  js  c++  java
  • 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的代码。


  • 相关阅读:
    [LeetCode] Maximum Depth of Binary Tree
    C++11中常用的几个简写
    [LeetCode] Word Break
    [LeetCode] Linked List Cycle II
    sizeof
    string和整形数据之间的转换
    ASCII
    [LeetCode] Linked List Cycle
    机器学习总结-线性回归
    推荐系统初探
  • 原文地址:https://www.cnblogs.com/dmesg/p/1546903.html
Copyright © 2011-2022 走看看