【发布时间】:2021-08-15 00:01:39
【问题描述】:
我参考了很多资源,但无法理解它究竟是如何修改容器中的元素的部分。 我写了一些代码试图理解,谁能解释发生了什么?
#include<bits/stdc++.h>
using namespace std;
bool test(char c)
{
return (c=='a');
}
int isPalindrome(string A)
{
remove_if(A.begin(), A.end(), test);
cout<<A<<'\n';
}
int main()
{
string A="aaaaabbbbb";
isPalindrome(A);
return 0;
}
根据我目前的理解,它应该将所有 a 字符移动到 b 的右侧,如果我们尝试打印它,我们应该得到
bbbbbaaaaa
相反,我得到了
bbbbbbbbbb
【问题讨论】:
-
remove_if 应该完全删除它们.. 不要移动它们
-
发生的事情是预期的行为。它根据谓词检查每个元素,如果条件为真,它们将被删除
-
在输出中打印额外 b 的原因是什么? @妮娜
-
算法不可能直接使用迭代器来修改容器。
std::remove_if可以做的最好的事情是对容器进行分区,使剩余的元素保留在分区的一侧,而容器的其余部分处于某种未指定的状态。该函数返回一个迭代器,它定义了有效值范围的结束。然后由函数的用户通过实际删除该迭代器之后的所有内容来缩小容器。 -
@Scheff -- 这是一个有趣的引用,因为它是错误的。
std::remove和std:remove_if对序列进行操作。该标准没有直接对序列结束后的任何内容施加任何要求。效果很可能是这些元素被移出,因此将产生从它们移出的任何结果。是的,当序列来自容器时,容器的大小不会改变。那是因为算法不是在容器上运行,而是在序列上运行。