首页 > 试题广场 >

(单选题)如下代码段中空白处应填入的代码正确的是:void

[单选题]
如下代码段中空白处应填入的代码正确的是()
void delete_obj(std::vector<Obj> &v_obj) {
    std::vector<Obj>::iterator it = v_obj.begin();
    while(it != v_obj.end()) {
        if(!it->isEmpty()) {
            ______ //此处填代码
        }else {
            ++it;
        }
    }
}
  • it = v_obj.erase(it++);
  • v_obj.erase(it);
  • it = v_obj.erase(it); it++;
  • v_obj.erase(it++);
v_obj.erase(v_obj.begin(), v_obj.end());
一行代码就搞定了

发表于 2019-04-10 20:24:04 回复(4)
这题应该选A,erase中的it++不影响最后it的赋值。 A虽然绕了一点但是是对的。D是错的,vector作为序列容器删除一个元素会导致后续所有元素的迭代器失效,必须得接erase的返回值
发表于 2020-08-09 22:14:55 回复(5)
选A是对的。 B选项,erase返回下一个元素的迭代器,但是没有将这个返回值赋给it。 C选项,由B的解释,it++多余 D选项,erase(it)之后,it成为野指针,对野指针执行前++是不行的(vector源码后置++的实现中,先是拷贝副本,然后执行前置++,最后返回副本)。 再来说A,其中的后置++很有迷惑性,加不加都可以运行,不加大家应该都理解,加了可以运行的原因还是在于后置++的源码实现,拷贝副本记录的是当前元素迭代器,而erase之后将下一个元素的迭代器赋值给it,此时再对副本++,其位置仍然是下一个元素迭代器,虽然多余,但是不错。
发表于 2020-09-22 11:35:28 回复(0)
废话不多说,直接上截图


D答案就算迭代器没失效,也根本就删不干净
发表于 2020-08-11 00:25:04 回复(2)
int main() {
    vector<int>arr{1,3,4,5,6,8};
    for (vector<int>::iterator it = arr.begin(); it != arr.end();it++) {
        if (*it == 5)  arr.erase(it++);
        cout << *it << " " << endl;
    }
    system("pause");
    return 0;
}
这种.erase(it++),直接变成了1,3,4,后面部分都没了。。。
正确的输入应该是 it=arr.erase(it);也不用++,
发表于 2019-08-28 12:37:41 回复(2)
这题应该选A,erase中的it++不影响最后it的赋值。 A虽然绕了一点但是是对的。D是错的,vector作为序列容器删除一个元素会导致后续所有元素的迭代器失效,必须得接erase的返回值,但是c影响了最后的赋值
发表于 2022-07-21 18:20:46 回复(0)
以下代码错误:
vector<int>::iterator it=vc.begin();
for(;it!=vc.begin();it++)
{ if(***) vc.erase(it);}
原因:erase()删除元素后,it失效,并不是指向下一个元素
解决方案:
for(it=va.begin();it<v1.end();)
{ if(***) it=v1.erase(it);
  else it++;
}
在C++11标准中,erase()会返回一个 iterator ,这个iterator指向了“当前删除元素的后继元素”
发表于 2019-04-14 13:15:26 回复(1)
我觉得正确答案应该是
it = v_obj.erase(it);
erase执行后,it变成了野指针,再执行it++应该会出错

发表于 2019-04-12 10:42:55 回复(7)
A选项其实it = v_obj.erase(it++)是为了迷惑人,其实直接it = v_obj.erase(it)就行。
D选项如果是用list则是对的,但这里是用vector。
发表于 2021-10-31 16:39:41 回复(0)
其实,这题不如说四个答案都错了。你允许代码这么写吗?多余的++。让大家在四个错误中选一个,这样出题合理吗?虽然A输出巧合正确,可是合乎规则吗?
发表于 2025-01-17 21:23:38 回复(0)
A答案中间的++操作无影响,修改一下为:
it = v_obj.erase(it);
erase函数返回一个指向被删除元素之后的元素的迭代器,如果被删除的是最后一个元素,则返回vector的end迭代器
编辑于 2023-11-23 16:21:07 回复(0)
请问一下A选项的it++是对哪个it的自加
如果it是内置类型,感觉A选项的程序和C选项的程序效果是一样的啊
发表于 2022-09-19 08:32:12 回复(0)
d哪里错了啊?
发表于 2022-03-02 23:01:01 回复(0)
两个知识点: 1) vector 的 erase函数返回值 -> 返回被删元素的下一个元素iterator; 2) ++ 与 = 的优先级, 自增优先级高与赋值优先级; 所以答案选A。 
发表于 2021-10-31 20:56:28 回复(0)
必须是A
发表于 2020-09-09 12:25:11 回复(0)

谁TM会写这种***代码,面大华问了这个问题,cpp reference上都没这么写!

发表于 2020-08-05 17:30:41 回复(1)
it++返回的是it的副本,也就是说erase(it++)删除的是it自增前的迭代器副本,对it本身不会有影响,这样it就被保存下来了。因此如果是erase(++it)就是错的。
发表于 2020-07-22 00:39:24 回复(0)
v_obj.erase(it++);
it++ 首先会生成一个temp = it传递给erase()
erase(temp)执行完后 it++
it指向下一个
发表于 2020-06-24 22:59:34 回复(0)
这个题的“正解”D有问题。而且vector哪里来isEmpty()函数?
vector删除成员的时候会进行后续的元素都往前移动,那么“正解”的D这个答案也就是it++后直接指向了下一个位置,跳过了从后面移动过来的一个元素。如果给的容器是list,这个操作倒是可以的。
这里A其实是对的,it=vector.erase(it)这种写法更清晰,正确。虽然选项中多了it++操作,但是后置++不影响传给vector的erase实参,且最后it=vector.erase也接住了新的迭代器位置,所以整体是可以正确运行的。
编辑于 2019-12-23 16:19:23 回复(0)
Kie头像 Kie
A哪里错了?
发表于 2019-10-12 00:15:30 回复(0)