用单行代码替换字符串中所有句点的C ++方法?

时间:2019-07-30 18:23:45

标签: c++ string replaceall

需要修改给定的字符串,以便没有句点。字符串的其余部分保持不变。

我想到了使用迭代方法并使用string :: erase。 在Java中,我可以使用replaceAll函数轻松完成它。 按照这些思路,开发人员发布了解决方案:

var divToChange = $('.home-hero-effect.background-wrapper');
var lastScroll = 0;
$(document).scroll(function(event){
    var st = $(this).scrollTop();
    if (st > lastScroll){
        var divHeight = divToChange.height();
        var divWidth = divToChange.width();
        divHeight-=5;
        divWidth-=5;
        divToChange.css({'width':divWidth, 'height':divHeight});
    } 
    else {
        var divHeight = divToChange.height();
        var divWidth = divToChange.width();
        divHeight+=5;
        divWidth+=5;
        divToChange.css({'width':divWidth, 'height':divHeight});
    }
    lastScroll = st;
});

该行代码可以完美运行。但是我不明白它是如何工作的。据我了解,擦除功能会删除范围内的所有字符。 remove函数在删除句点之后将迭代器返回到该点,然后从该点擦除功能。我很困惑。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

很容易感到困惑,但是删除功能是删除所有句点。

假设在remove之前您的字符串是"a.b.c.",然后在remove之后是"abc..."。擦除方法正在执行的操作是擦除现在位于字符串末尾的句点。

现在,问为什么remove如此行事是一个合理的问题,但考虑一下remove的功能,它只有一对迭代器。迭代器不能用于从容器中删除项目,迭代器不能使您访问它所引用的容器。因此remove(及其他类似功能)无法从容器中删除任何内容。他们所能做的就是重新排列顺序,以便以后的一些代码可以轻松地进行实际删除。

这个成语有个名字,但此刻我已经不知道了。

答案 1 :(得分:0)

std::remove作用于范围。范围是一对迭代器,分别表示其beginend

std::string::erase或任何容器erasestring(/容器)起作用。

从范围中删除元素可以认为是返回了一个新范围。例如,通过将元素放置在end上将其从范围中删除,新范围是从beginend-1

从容器中删除元素是不同的。容器拥有该元素,并负责实际“擦除”该元素。

总结:您将开始将temp.begin()组成的范围内的所有元素传递到temp.end(),直到std::remove传递给end为止(之后是改组元素),最后std::string::erase缩小string以仅包含该新字符范围。