我有这样的逻辑,理想情况下应该在int数组中找到int对,找到对后,将其从数组本身中删除并重新开始。
在调试过程中,我注意到,对于给定的样本输入测试用例,当i=0
和j=3
满足if
条件并找到第一个pair
时,pairs
值会增加,然后两个值都会按预期从数组中删除,n
从9
减至7
,然后j
设置为0
,现在,控制权返回到for
语句,理想情况下,应该将for循环的主体作为j<n
来执行,但是,我在调试器中看到,当执行for
语句时,j
被设置为1
。
我不明白。在我的for
循环中,增量到底是什么时候发生的,因为如果我只是将其设置为0
,并且条件满足,则控件应该继续寻找下一对?
/*
sample input case
9 (n number of inputs)
10 20 20 10 10 30 50 10 20 (array of ints)
*/
for (int i = 0; i < n; i++) {
for (int j = 1; j < n; j++) {
if (ar[i] == ar[j]) {
pairs++;
ar.erase(ar.begin() + i);
ar.erase(ar.begin() + j-1);
n-=2;
j = 0;
}
}
}
引用cppreference,这是循环
for (init_statement ; condition ; iteration_expression) {
statement
}
相当于:
{
init_statement
while ( condition ) {
statement
iteration_expression ;
}
}
您的混淆很可能是由于在迭代时擦除元素造成的。不建议在迭代期间插入/删除元素。如果您这样做了,您必须考虑到在iteratonn
中,容器中的n-th
元素不一定是原始容器中的n-th
元素。阅读擦除-删除习惯用法,了解一种不易出错的擦除元素的方法。