2009-07-08 74 views
0

我正在寫一個簡單的程序,它試圖在給定的數字後查找下一個迴文數。C++:使用迭代器替換部分字符串不工作

至於現在,我被困在這一點上:

string::iterator iter; // iterators for the string 
string::iterator riter; 


//testcases is a vector<string> with strings representing numbers. 
for (unsigned int i = 0; i < testcases.size() ; ++i) { 
    iter = testcases[i].begin(); 
    riter = testcases[i].end(); 

    while (!isPalin(testcases[i])) { //isPalin(string) is a function 
             //which is checking if given string 
             //is a palindrome 

     //if n-th digit from the end is different from the 
     //n-th digit, then I want to replace latter one, so they will 
     //be the same. 
     if (*iter != *riter) { 
      testcases[i].replace(riter, riter, *iter); 
     } 

     ++iter; // advancing forward iterator; 
     --riter; // advancing backward iterator; 
    } 
    cout << testcases[i] << " -> ok\n"; 
} 

當我編譯這個使用Microsoft Visual Studio 2008中,我得到這個錯誤:

Compiling... 
main.cpp 
.\main.cpp(53) : error C2664: 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::replace(unsigned int,unsigned int,const std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1 from 'std::_String_iterator<_Elem,_Traits,_Alloc>' to 'unsigned int' 
     with 
     [ 
      _Elem=char, 
      _Traits=std::char_traits, 
      _Ax=std::allocator 
     ] 
     and 
     [ 
      _Elem=char, 
      _Traits=std::char_traits, 
      _Alloc=std::allocator 
     ] 
     No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

我做有些愚蠢的或我錯過了什麼? 我會很感激任何幫助/建議。

+0

起初我想知道你是否在談論莎拉佩林。 – jergason 2009-10-31 03:26:43

回答

2

關於你的代碼有:

爲什麼你不只是在兩個迭代結束分配值?

if (*iter != *riter) { 
    *riter = *iter; 
} 

由於奧利指出的那樣,在代碼中的其他問題,其中第一個就是要設置riter被string.end()事實上,女巫是一種非解引用,能夠迭代器。 end()迭代器總是一個結束,因此上面的使用將嘗試寫入超出分配的內存。

也許你應該嘗試使用.rbegin()來代替。它將提供一個反向迭代器,指向在你遞增時向字符串開頭移動的最後一個元素。

在算法:

如果您的目的是尋找下一個號碼是迴文,我不知道你已經實現的算法是正確的。例如,如果輸入號碼是123456,算法會檢測到它不是迴文,並將轉換爲小於原始號碼的12345_1_。

+0

@dribeas - 感謝您對我的代碼的建議和分析。你在任何方面都是對的 - 我會改進你所發佈內容的代碼,並在以後發佈改進後的版本(希望工作)。我只是需要從頭開始檢查這個字符串 - 但是從中間開始,但沒有你的sugesstions - 我不會注意到這一點。 – zeroDivisible 2009-07-08 09:42:51

1

您正在嘗試使用重載替換字符串中的一個字符。如果您看到字符串的成員函數,則嘗試使用的替換的特定重載要求您要替換的字符數。因此,你應該更改您的代碼:

testcases[i].replace(riter, riter, 1, *iter); 
2

除了dribeas的回答我建議你,以避免過多索引字符串初始化riter爲‘.end() - 1’。

0

你似乎遇到的問題是,替換(...)的第一個參數需要是一個無符號整數,並且你要給一個字符串迭代器。你有沒有試圖在字符串迭代器之前添加一個*來獲取迭代器的內容?