我在StackOveflow和其他来源上已经读到,remove函数的行为只是对原始容器进行重新排序,以便将要删除的元素移动到容器的末尾,并且不会被删除。它们仍然是容器的一部分,remove()函数仅返回一个迭代器,该迭代器界定了要保留的元素范围的结尾。

因此,如果您从未真正修剪容器中那些具有“已删除”值的部分,那么它们应该仍然存在。

但是,当我运行下面的代码时,未“删除”的字母数字字符后没有尾随空格。

int main()
{
    std::string test "this is a test string with a bunch of spaces to remove";
    remove(test.begin(), test.end(), ' ');
    std::cout << test << std::endl;

    return 0;
}

这里发生了什么?好像我从不调用test.erase()一样,我的字符串上不应该有一堆尾随空格吗?是否可以保证在调用remove()之后“已删除”项仍然存在?

PS-我不是在寻找有关如何最好地从字符串中删除空格的建议,以上只是让我感到困惑的remove()行为的说明性示例。

最佳答案

调用remove后,在容器末尾剩下的不一定是已删除的元素。只是垃圾它很可能是“在调用删除之前处于什么位置”,但是您也不能依靠它。就像未初始化的变量一样,它可以是任何东西。

例如,字符串:

"Hi I am Bob!\0"

调用remove删除空格后,可能看起来像这样
"HiIamBob!\0b!\0"

但是,您不会在cout上看到它,因为一旦打到'\ 0',它将停止打印。

关于c++ - STL remove()函数的行为-仅重新排列容器元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3258831/

10-13 08:13