I am writing a simple program, which is trying to find next palindrome number after given number.
As for now, I am stuck at this point:
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";
}
When I am compiling this one using Microsoft Visual Studio 2008, I am getting this error:
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
Am I doing something stupid or am I missing something?
I would be grateful for any help / suggestion.
About the code you have:
Why don’t you just assign the values at the end of the two iterators?
As Oli pointed out, there are other problems in the code, the first of which is the fact that you are setting riter to be string.end(), witch is a non-dereference-able iterator. end() iterators are always one past the end, and thus the use above will try to write beyond the assigned memory.
Maybe you should try using .rbegin() instead. It will provide a reverse iterator pointing to the last element that moves towards the beginning of the string as you increment it.
On the algorithm:
If your intention is finding the next number that is a palindrome, I am not sure that the algorithm you have implemented is correct. As an example, if the input number is 123456 the algorithm will detect that it is not a palindrome and will convert to 12345_1_ which is smaller than the original number.