为什么 std::remove 不删除数组的最后一个元素
Why doesn't std::remove remove the last element of my array
可能的重复:
STL删除无法正常工作?
对不起,我是C 11和迭代器的新手。这应该删除数组中的所有数字3,但不会删除最后一个。为什么?
#include <algorithm>
#include <array>
#include <iostream>
int main() {
std::array<int, 8> a{{9, 3, 4, 5, 33, 5, 6, 3}};
int N(3);
std::remove(a.begin(), a.end(), N);
for (int i : a) {
std::cout << i << 'n';
}
}
我作为输出:
{ 9, 4, 5, 33, 5, 6, 6, 3 }
^
|
// the last 3 is still there
算法不了解基础容器。他们只是根据给出的迭代器进行迭代,并独立于容纳容器的访问元素。这就是为什么有一种称为擦除示例习惯的原因,它采用以下模式:
container.erase(std::remove(it1, it2, value), std::end(container));
std::remove
将保留的元素移至前面(谢谢,k-ballo),并将迭代器返回到未换元素的开始。然后, erase
擦除了从那点到末端的所有内容。
由于std::array
封装了固定大小的数组,我将适应您的 std::vector
示例:
std::vector<int> v{9, 3, 4, 5, 33, 5, 6, 3};
v.erase(std::remove(std::begin(v), std::end(v), 3), std::end(v));
唯一要注意的是.begin()
和.end()
的更通用形式,它也适用于内置数组。这包含在C 11中。
std::remove
在迭代器上操作;因此,它无法实际擦除容器中的元素。这就是为什么它通常与erase
一起使用:
a.erase(std::remove(a.begin(), a.end(), N), a.end());
正如其他人所指出的,这对array
不起作用。
正如其他人指出的那样,std::remove()
不会删除任何元素。如果您需要使用std::array<...>
,则仍然可以使用std::remove()
并捕获相应的迭代器以确定序列的末尾。您如何获得我不知道的声称的输出(带有卷发和逗号),但这是我如何实施它:
auto end = std::remove(a.begin(), a.end(), 3);
std::cout << "{ ";
if (a.begin() != end) {
std::copy(a.begin(), end - 1, std::ostream_iterator<int>(std::cout, ", "));
std::cout << end[-1];
}
std::cout << "}n";
相关文章:
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 我正在尝试将我的 c++ 数组从第二个索引切到最后一个索引
- 使用数组将最后一个最大值更改为第一个最小值
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?
- 如何在 c++ 中将元素添加到数组的最后一个
- 数组 - 最后一个索引
- 数组中无法解释的最后一个项目
- C++ - 数组中的最后一个值在映射中重复
- C++程序在迭代到数组的最后一个元素时崩溃
- 缓冲区用不需要的数据填充 char 数组中的最后一个空格
- 当将多个TypedArrayContents数组加载到V8数组中时(数组数组)时,最后一个元素将覆盖所有元素
- 'char' c++ 类型的数组中的最后一个符号
- c ++ 我的 char* 数组被最后一个添加的元素覆盖
- 为什么要指向数组或向量中最后一个元素之后的内存位置
- C++2d数组,用文件中最后一个元素值填充所有元素
- C++ - 查找数组中第一个和最后一个负数之间的数字
- 如何在不修改现有函数的情况下反转数组中除第一个和最后一个元素之外的所有元素
- 为什么 std::remove 不删除数组的最后一个元素