STL remove()函数的行为 - 只重新排列容器元素?

时间:2010-07-15 18:46:21

标签: c++ stl

我在这里读过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()行为的说明性示例。

2 个答案:

答案 0 :(得分:1)

调用remove后,容器末尾的内容不一定是已删除的元素。这只是垃圾。最有可能的是“在删除电话之前处于那些位置的任何东西”,但你也不能依赖它。就像一个未初始化的变量,它可能是任何东西。

例如,字符串:

"Hi I am Bob!\0"

调用remove以消除空格可能看起来像这样

"HiIamBob!\0b!\0"

但是,您不会在cout上看到它,因为它会在点击'\ 0'后停止打印。

答案 1 :(得分:0)

您可能愿意获得Boost.String

这是一系列用于处理字符串的算法。

boost::erase_all(test, " ");