std::erase 和 std::remove 组合以删除特定元素不适用于特定示例
std::erase and std::remove combination to delete specific element doesn't work for specific example
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> a = {1,2,3,7,1,5,4};
vector<int> b = {6,7,4,3,3,1,7};
a.erase(remove(a.begin(),a.end(),a[0]),a.end());
b.erase(remove(b.begin(),b.end(),b[0]),b.end());
return 1;
}
对于这个具体的例子,我的 GNU gdb Ubuntu 7.7.1 指出返回 1 行:a = {2,3,7,1,5,4},这是不预期的(只删除一个1(,并且b = {7,4,3,3,1},这是意料之中的。
我的期望是 b 应该是 a=2,3,7,5,4 和 b=7,4,3,3,1,7。
这是怎么回事?
std::remove()
的声明看起来像
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
请注意,最后一个参数是引用。因此,在编译后,它有效地传递了指定元素的地址。
通过remove(a.begin(), a.end(), a[0])
,指示a
的第0个元素的地址的东西被传入。当remove()
运行时,一旦处理了第 0 个元素,传入的引用所指向的值就会更改,从而导致意外结果。
要获得预期结果,请在调用 std::remove()
之前复制。
int toberemoved = a[0];
a.erase(remove(a.begin(),a.end(),toberemoved),a.end());
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何从存储在std::映射中的std::集中删除元素
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- std::矢量保存 只推送最后一个元素
- std::map:当元素不可默认构造时创建/替换元素
- 如何读/写或遍历 std::array 中的特定元素范围?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 为什么 std::p air 的大小与其元素的大小之和不同?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 使用 std::min_element、std::max_element 查找矢量中的最小和最大元素
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- call call cons构件功能的std ::元素的每个元素