我正在尝试将向量的第 0 个元素与其他元素进行比较以删除等于它的其他元素,但我得到了意外的输出



所以我想将向量的第0个元素与其他元素进行比较,看看它们是否相等,因为我想从向量中删除该元素值的其他实例,例如{1,1,2,3,1}变为{1、2,3},这是我写的代码:

std::vector<int> arr = {1,1,5,5,1,1};
for (int k = 1; k < arr.size(); k++)
{
if(arr[0] == arr[k]) {
arr.erase(arr.begin() + k);
}

我期望的结果是:

155

因为它应该删除1的所有实例,除了第一个实例,但我得到的是:

1551

最后一个1来自哪里?我该如何解决?

循环写入错误。

for (int k = 1; k < arr.size(); k++)
{
if(arr[0] == arr[k]) {
arr.erase(arr.begin() + k);
}

你应该至少写

for (int k = 1; k < arr.size(); )
{
if(arr[0] == arr[k]) 
{
arr.erase(arr.begin() + k);
}
else
{
++k;
}
}

但无论如何,最好使用标准算法std::remove。例如

arr.erase( std::remove( std::next( std::begin( arr ) ), std::end( arr ), arr[0] ), std::end( arr ) );

这是一个示范节目。

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main() 
{
std::vector<int> arr = { 1, 1, 5, 5, 1, 1 };
arr.erase( std::remove( std::next( std::begin( arr ) ), std::end( arr ), arr[0] ),
std::end( arr ) );

for ( const auto &item : arr ) std::cout << item << ' ';
std::cout << 'n';

return 0;
}

其输出为

1 5 5 

问题是,在删除元素后,for循环的索引一直在增加。假设k是1。您删除了arr[1]元素。之后arr[1]为5,但指数正在增加到2。所以实际上你需要再次检查arr[1],但你不会。因此,通过这种方式,您可以跳过数组中的一些元素。

我建议用while循环代替for循环,并且只有在不擦除元素的情况下才增加索引。

最新更新