天天看點

C++primer 第五版練習9.43 練習9.44

用疊代器總是編譯無法通過用下标可以妥妥的編譯過

練習9.43

在程式檢測出與oldva[0]相等的第一個字元後。

在s中截取一塊長為oldval.size()的string 與 oldval相比較 ,

相等則置換

再多的語句抵不上一個 compare()函數來的友善。。。

compare(下标_初始位置,長度,要比較的string)

相等傳回 0;

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
void find_string_change(string &s,const string& oldval
                   ,const string& newval) 
{
    for(unsigned i=;i<s.size();++i)
    {
        if(s[i]==oldval[])
        {
            if(i+oldval.size()<=s.size())
               if(!s.compare(i,oldval.size(),oldval)) //相等傳回0
                    s.replace(i,oldval.size(),newval);
        }
    }
}
int main()
{  
    string a="ohjksdffthouuuffshshthousannnfthaot hou";
    string b="thou";
    string c="thought";    
    find_string_change(a,b,c);
    cout<<a<<endl;    
    return ;   
}
           

(2)

用下标 ,insert ,erase版本

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
using iter = const char* ; 

void find_string_change(string &s,const string& oldval, const string& newval) 
{   
    for(unsigned i=;i<s.size();++i)
    {
        iter iter1=s.c_str();
        if(s[i]==oldval[])
        {           
            if(i+oldval.size()<=s.size())
            {                   
                string v(iter1+i,iter1+i+oldval.size());
                if(v==oldval)
                {
                    s.erase(i,oldval.size());
                    s.insert(i,newval); // void無傳回 

                   // s.replace(i,oldval.size(),newval);      
                }           
            } 

        }

    }
}
int main()
{  


    string a{"thousannnfthothou"} ;
    string b{"thou"};
    string c{"thought"};

    find_string_change(a,b,c);
    cout<<a<<endl;

    return ;

}
           

編譯器用iterator沒有能運作了的。。盡管代碼理論可行

繼續閱讀