我在这里读过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()行为的说明性示例。
答案 0 :(得分:1)
调用remove
后,容器末尾的内容不一定是已删除的元素。这只是垃圾。最有可能的是“在删除电话之前处于那些位置的任何东西”,但你也不能依赖它。就像一个未初始化的变量,它可能是任何东西。
例如,字符串:
"Hi I am Bob!\0"
调用remove
以消除空格可能看起来像这样
"HiIamBob!\0b!\0"
但是,您不会在cout
上看到它,因为它会在点击'\ 0'后停止打印。
答案 1 :(得分:0)