c++ - C++ 矢量擦除功能无法正常工作
问题描述
我想删除值大于 2 且小于 5 的所有元素,代码如下:
vector<int> myvector{3, 3, 3, 3, 3, 3, 3, 1, 2, 3, 4, 5 , 2, 3, 4, 9};
vector<int>::iterator it;
it = myvector.begin();
for(int i = 0; i < myvector.size(); i++)
{
if(myvector[i] > 2 && myvector[i] < 5)
{
myvector.erase(it+i);
}
}
for(int i = 0; i < myvector.size(); i++)
{
cout << ' ' << myvector[i];
}
输出:3 3 3 1 2 4 5 2 4 9
问题出在哪里。
解决方案
使用应用标准算法 std::remove_if 的方法。例如
#include <vector>
#include <iterator>
#include <algorithm>
//...
std::vector<int> myvector{ 3, 3, 3, 3, 3, 3, 3, 1, 2, 3, 4, 5 , 2, 3, 4, 9 };
myvector.erase( std::remove_if( std::begin( myvector ), std::end( myvector ),
[]( const auto &item )
{
return 2 < item && item < 5;
} ), std::end( myvector ) );
for (const auto &item : myvector) std::cout << item << ' ';
std::cout << '\n';
此代码段的输出是
1 2 5 2 9
使用这个 for 循环
for(int i = 0; i < myvector.size(); i++)
是不正确的。例如,如果您有一个包含 2 个元素的向量,并且在第一次迭代中,当 i 递增并等于 1 时,索引为 0 的元素被删除。所以现在 i 等于 1 不小于然后返回的size()
值第二个元素不会被删除。
除此之外,这种在向量中顺序擦除元素的方法也是低效的。
推荐阅读
- macos - 如何通过命令行 mac os 更改 nginx.conf 上的端口?
- laravel - laravel-ffmpeg - fopen(/tmp/laravel-ffmpegi340VY.mkv):无法打开流:没有这样的文件或目录
- react-native - React Native 高重渲染时间成本
- django - 在 django 的一个模板目录中可以有多个 html 文件吗?
- c - C 可以假设我想存储我的字符的数组吗?
- laravel - Laravel Vuetify - 将所有 CSS 内联
- ios - SwiftUI A View.environmentObject(_:) for 可能作为此视图的祖先丢失。:文件
- excel - 获取按行列出的数据以放在列中
- excel - 如何复制工作表而不复制其工作表私有子代码
- python - 如何在 Pygame 中围绕偏离中心的枢轴旋转图像