向量擦除功能无法正常工作

时间:2019-05-03 22:30:01

标签: c++

我正在尝试hackerrank上的一种实践问题。
我知道有更好的方法可以做到,但是我想知道为什么这种方法无法更好地理解它。
矢量擦除功能似乎可以按预期运行,直到最后几次,然后以错误的索引擦除,即使没有任何变化。

调试器输出:
1,1,3,1,2,1,1,3,3,3,3,//向量中当前是什么
Delete indx 0&1 //我将擦除的第一对并增加计数

3,1,2,1,3,3,3,3,//继续...
删除indx 0和4

1,2,1,3,3,3,
删除indx 0和2

2,3,3,3,
Delete indx 1&2 //删除前三个和后三个

3、3 // //看起来像第0位,其他一些索引也被删除了
删除indx 0和1

返回的计数是:5
让我知道是否可以添加此问题以使其变得更好,谢谢

int i, count = 0;

for (i=0;i<ar.size()-1;i++)
{
    for (int j=i+1;j<ar.size();j++)
    {
        if (ar[i] == ar[j])
        {
            ar.erase(ar.begin()+i-1);
            ar.erase(ar.begin()+j-1);
            count++;
            i=-1;
            break;
        }
    }
    if (ar.size()== 0)
        break;
}

1 个答案:

答案 0 :(得分:0)

据我了解,您只需要成对计数(考虑清除)。

for(int i = 0; i < ar.size() - 1; i++){
    for(int j = i + 1; j < ar.size(); j++){
        if(ar[i] == ar[j]) {
            ar.erase( ar.begin() + j );
            count++; 
            break;
        }
    }
}

这样,您只需要执行1次擦除操作(这很慢,因为考虑到它会将已删除元素1插槽右侧的所有元素向左移动)。

如果向量很大,也请考虑不要一直使用ar.size()(至少在j循环中,因为在i循环中这很重要)。尝试for(int j = i + 1, len = ar.size(); j < len; j++)