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

Posted

技术标签:

【中文标题】C++:使用迭代器替换部分字符串不起作用【英文标题】:C++: Replacing part of string using iterators is not working 【发布时间】:2009-07-08 05:17:42 【问题描述】:

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

至于现在,我被困在这一点上:

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

我是在做一些愚蠢的事情还是我错过了什么? 如有任何帮助/建议,我将不胜感激。

【问题讨论】:

一开始我想知道你是不是在说 Sarah Palin。 【参考方案1】:

关于你拥有的代码:

为什么不在两个迭代器的末尾赋值呢?

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

正如 Oli 指出的,代码中还有其他问题,第一个问题是您将 riter 设置为 string.end(),witch 是一个不可取消引用的迭代器。 end() 迭代器总是在末尾之后,因此上面的使用将尝试写入超出分配的内存。

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

关于算法:

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

【讨论】:

@dribeas - 感谢您对我的代码的建议和分析。你在各个方面都是对的——我会改进关于你发布的内容的代码,并在以后发布改进的——(希望可以工作)版本。我只需要从头开始检查这个字符串 - 而是从中间开始,但没有你的建议 - 我不会注意到这一点。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于C++:使用迭代器替换部分字符串不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我的迭代器实现不起作用,它有啥问题?

如何在 Visual Studio 即时窗口中获取迭代器的元素值? *迭代器不起作用[关闭]

地图删除器在 C++ 中不起作用?

检查数组中是不是存在迭代器时,array.includes 不起作用[重复]

Laravel:array_push 在 collection->each() 迭代器中不起作用

正则表达式替换在 PHP 中不起作用