2009-07-08 1 views
0

与えられた番号の後に次の回文番号を見つけようとしている簡単なプログラムを書いています。C++:イテレータを使って文字列の一部を置き換えることができません

今のように、私はこの時点で立ち往生しています:私は、MicrosoftのVisual Studio 2008を使用して、このいずれかをコンパイルしていた場合

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"; 
} 

、私はこのエラーを取得しています:

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

答えて

2

:あなたはちょうど2つのイテレータの最後に値を割り当てていないのはなぜ

?オリが指摘したように

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

、あなたは)(string.endすることriterを設定しているという事実である第一そのコード内の他の問題は、そこにある、魔女は非逆参照可能なイテレータです。 end()イテレータは常に最後の1つで、したがって上記の使用は割り当てられたメモリを超えて書き込もうとします。

代わりに.rbegin()を使用してみることをおすすめします。それはあなたがそれを増やすときに文字列の先頭に向かって移動する最後の要素を指す逆の反復子を提供します。このアルゴリズムでは

あなたの意図は回文で次の番号を見つけている場合は、私はあなたが実装したアルゴリズムが正しいことを確認していません。たとえば、入力番号が123456の場合、アルゴリズムは回文ではないことを検出し、元の数よりも小さい12345_1_に変換します。

+0

@dribeas - 私のコードの提案と分析に感謝します。あなたはすべての面で正しいです - 私はあなたが投稿したものに関するコードを改善し、後で改善された(そしてうまくいけば働く)バージョンを投稿します。私はちょうど最初からこの文字列をチェックし始める必要があります - しかし、真ん中から、あなたの勇気がない - 私はそれを気付かなかったでしょう。 – zeroDivisible

1

文字列内の1文字を置き換えるオーバーロードを使用しようとしています。文字列のメンバ関数が表示された場合、使用しようとしている置換の特定のオーバーロードには、置換する文字数が必要です。したがって、あなたがあなたのコードを変更する必要がありますdribeas'答えに加えて

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

私は、文字列をオーバーインデックス避けるために、 『.end() - 1』へriterを初期化することをお勧めします。

0

あなたが持っているように見える問題は、置換(...)の最初のパラメータが符号なしintで、文字列イテレータを与える必要があるということです。その文字列イテレータの前に*を追加してイテレータの内容を取得しようとしましたか?

関連する問題