C ++:使用迭代器替换部分字符串不起作用

时间:2009-07-08 05:17:42

标签: c++ visual-studio-2008 string iterator

我正在编写一个简单的程序,它试图在给定数字后找到下一个回文数。

至于现在,我陷入了困境:

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

我做了些蠢事还是我错过了什么? 我将不胜感激任何帮助/建议。

4 个答案:

答案 0 :(得分:2)

关于您拥有的代码:

为什么不直接在两个迭代器的末尾分配值?

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

正如Oli指出的那样,代码中还有其他问题,第一个问题是你将riter设置为string.end(),这是一个不可解除引用的迭代器。 end()迭代器总是超过结束,因此上面的使用将尝试写入超出指定的内存。

也许你应该尝试使用.rbegin()代替。它将提供一个反向迭代器,指向在递增时向字符串开头移动的最后一个元素。

关于算法:

如果您打算找到下一个回文数,我不确定您实施的算法是否正确。例如,如果输入数字是123456,算法将检测到它不是回文并且将转换为小于原始数字的12345_1_。

答案 1 :(得分:2)

除了dribeas的回答,我建议您将riter初始化为“.end() - 1”,以避免过度索引字符串。

答案 2 :(得分:1)

您正在尝试使用重载替换字符串中的一个字符。如果您看到string的成员函数,则您尝试使用的替换的特定重载需要您要替换的字符数。因此,您应该将代码更改为:

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

答案 3 :(得分:0)

你似乎遇到的问题是,replace(...)的第一个参数需要是unsigned int,你需要给出一个字符串迭代器。您是否尝试在该字符串迭代器之前添加*以获取迭代器的内容?