首页 > 试题广场 >

下列哪段代码是实现在一个vector中查找匹配值value并

[不定项选择题]
下列哪段代码是实现在一个vector中查找匹配值value并删除:

  • for (std::vector::iterator iter = numbers.begin(); iter != numbers.end(); ++iter) {
        if (*iter == value) {
            numbers.erase(iter);
        }
    }
  • for (std::vector::iterator iter = numbers.begin(); iter != numbers.end(); ++iter) {
        if (*iter == value) {
            numbers.erase(iter);
            iter--;
        }
    }
  • for (std::vector::iterator iter = numbers.begin(); iter != numbers.end();) {
        if (*iter == value) {
            iter = numbers.erase(iter);
        } else {
            ++iter;
        }
    }
  • 以上代码都不对
erase()函数的特点就是删除当前的元素,并自动指向下一个元素,所以这里iter不需要在自增了。
发表于 2019-08-06 10:14:35 回复(1)
erase()函数的特点就是删除当前的元素,并自动指向下一个元素,但是B选项对迭代器--,如果要删除第一个元素那不就是越界了?感觉题目有点不严谨。
发表于 2020-02-21 19:52:36 回复(3)
BC都没问题

#include <vector>
#include <iostream>
#include <sstream>
int main() {
    std::vector<int> vec{1,2,2,3,4,5,2,3,3,5};
    std::ostringstream oss;
    for (auto v : vec) {
        oss << v << ",";
    }
    std::cout << "initial vec: " << oss.str() << std::endl;
    // for (std::vector<int>::iterator iter = vec.begin(); iter != vec.end(); ) {
    for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
        if (*iter == 2) {
            vec.erase(iter);
            // continue;
            iter--;
        }
        // ++iter;
    }
    oss.str("");
    for (auto v : vec) {
        oss << v << ",";
    }
    std::cout << "after delete 2, vec: " << oss.str() << std::endl;
}



发表于 2019-08-16 14:46:54 回复(5)
b答案如果删除的是第一个,自减会出问题吧
发表于 2019-09-13 11:06:37 回复(0)
这道题的B选项是错误的,运行之后会提示“引发了异常: 读取访问权限冲突。**_Mycont** 是 nullptr。“这个错误并且程序崩溃,运行环境:visualstudio2022版,编译器默认配置。


编辑于 2021-11-30 22:39:21 回复(1)

B 选项不严谨

参考: cppreference

里面的:

Invalidates iterators and references at or after the point of the erase, including the end() iterator.

The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferenceable) cannot be used as a value for pos.

可以清楚的看到, erase 容器内的元素之后,所有在 erase 元素之后的迭代器失效.在 erase 之后,继续遍历的话,那么在下一次遍历的时候,必须使用 erase 所返回的迭代器.
B 选项显然没有这么做,所以 B 是错的

发表于 2021-02-24 13:26:22 回复(0)
B答案是错的❌吧 对于顺序容器vector queue deque erase会使当前及后面的迭代器失效 但是erase会返回指向下一个元素的迭代器
发表于 2020-01-09 09:03:26 回复(0)
感觉B不对啊
该代码使用迭代器循环遍历 vector 中的元素,并使用 if 条件判断当前元素是否与给定的 value 匹配。如果匹配,则使用 erase 方法删除当前元素,并返回指向下一个元素的迭代器。

通过使用iter = numbers.erase(iter),我们可以在删除当前元素后更新迭代器 iter,使其指向下一个元素。 如果不匹配,则使用 ++iter 将迭代器移动到下一个元素。

这种方式可以确保在删除元素后正确地更新迭代器,以便遍历整个 vector。

发表于 2023-10-20 20:51:08 回复(0)
erase:删除当前元素,并自动指向下一个元素 A:erase删除后,指向下一个元素,再进行++it,会漏掉一个元素没有判断 B:如果删除的是首元素,--it会发生错误 C:是正确的写法,如果没有删除元素,it++。
编辑于 2021-02-27 08:53:24 回复(0)
B哪里错了啊?虽然我选的C,但是B也没问题啊?
发表于 2019-08-12 22:48:20 回复(1)
B不对?
发表于 2019-07-02 15:13:14 回复(2)
B选项中,--it之后,会被for循环的++it抵消,这时只有erase函数返回值导致的+1,即使是删除首位,也不会出错,故而B也是对的
发表于 2023-11-17 21:11:32 回复(0)
在linux环境下B选项没问题,VS下B选项出错
发表于 2023-09-24 20:01:20 回复(0)
b应该会造成迭代器失效
发表于 2023-04-21 17:54:27 回复(0)
指向被删除的元素的迭代器在erase后已经失效了,再进行自增或者自减操作会报错
发表于 2022-08-28 15:03:18 回复(0)
erase()函数删除当前元素之后,后面的元素会往前挪一位,默认指向了下一个元素的位置,所以A选项会导致漏删连续的数字。C中if成立的条件,就直接利用了指向下一个元素的位置的性质。
发表于 2022-07-25 09:31:44 回复(0)
b怎么会对?容器的迭代器删除以后删除点之后的迭代器失效了啊,所以erase才会返回下一个更新的迭代器,手头有书的可以翻翻c++ primer 5th的315页。 而且我本地敲了一遍,直接指针访问冲突了。。
发表于 2022-05-06 18:36:31 回复(0)
b是返回指向下一个位置的迭代器。不是直接让迭代器指向下一个!!!还有越界问题
发表于 2022-04-02 00:21:41 回复(0)
B的方法迭代器不会失效吗
发表于 2022-01-26 09:20:01 回复(0)
b也是对的吧
发表于 2021-12-03 22:42:25 回复(0)