2009-07-08 2 views
0

Ich schreibe ein einfaches Programm, das nach der nächsten Nummer versucht, nächste Palindrome Nummer zu finden.C++: Ersetzen Teil der Zeichenfolge mit Iteratoren funktioniert nicht

Was jetzt bin ich an dieser Stelle fest:

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

Wenn ich dieses bin Kompilieren mit Microsoft Visual Studio 2008, ich diese Störung erhalte:

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 

Bin ich tun etwas dummes oder fehlt mir etwas? Ich wäre dankbar für jede Hilfe/Anregung.

+0

Ich wunderte mich zuerst, wenn Sie über Sarah Palin sprachen. – jergason

Antwort

2

über den Code, den Sie haben:

Warum weisen Sie nicht nur die Werte am Ende der beiden Iteratoren?

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

Als Oli wies darauf hin, gibt es andere Probleme im Code, der erste davon ist die Tatsache, dass Sie riter setzen werden string.end(), Hexe ist ein nicht-Dereference-able Iterator. end() - Iteratoren sind immer eins nach dem Ende, und daher versucht die obige Verwendung, über den zugewiesenen Speicher hinaus zu schreiben.

Vielleicht sollten Sie stattdessen .rbegin() versuchen. Es wird einen umgekehrten Iterator bereitstellen, der auf das letzte Element zeigt, das sich beim Inkrementieren an den Anfang der Zeichenfolge bewegt.

Auf dem Algorithmus:

Wenn Ihre Absicht ist die nächste Zahl zu finden, die ein Palindrom ist, ich bin nicht sicher, dass der Algorithmus Sie implementiert haben korrekt ist. Wenn die Eingabe beispielsweise 123456 ist, erkennt der Algorithmus, dass es sich nicht um ein Palindrom handelt, und konvertiert zu 12345_1_, das kleiner als die ursprüngliche Zahl ist.

+0

@ribeas - danke für Vorschläge und Analyse meines Codes. Sie sind in jeder Hinsicht richtig - ich werde den Code bezüglich Ihrer Beiträge verbessern und die verbesserte (und hoffentlich funktionierende) Version später veröffentlichen. Ich muss nur anfangen, diese Saite nicht von Anfang an zu überprüfen - aber aus der Mitte, aber ohne Deine Beschwerden - das hätte ich nicht bemerkt. – zeroDivisible

1

Sie versuchen eine Überladung zu verwenden, die ein Zeichen in der Zeichenfolge ersetzt. Wenn Sie die Elementfunktionen von string sehen, erfordert die bestimmte Überladung von replace, die Sie zu verwenden versuchen, die Anzahl der Zeichen, die Sie ersetzen.

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

Neben dribeas Antwort: Ich schlage vor, Sie riter auf ‚.end() - 1‘, um zu initialisieren overindexing die Zeichenfolge zu vermeiden: Daher sollten Sie Ihren Code zu ändern.

0

Das Problem, das Sie zu haben scheinen, ist, dass der erste Parameter von replace (...) ein unsigned int sein muss und Sie einen String-Iterator geben. Haben Sie versucht, ein * vor diesem String-Iterator hinzuzufügen, um den Inhalt des Iterators zu erhalten?