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 来自哪里,我该如何解决?

4

2 回答 2

3

循环写错了。

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 
于 2020-08-15T08:13:30.063 回答
2

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

我建议用 while 循环替换 for 循环并仅在不删除元素时才增加索引。

于 2020-08-15T08:15:13.230 回答