当前位置: 首页 > 知识库问答 >
问题:

为什么擦除+删除比删除更有效

曾沛
2023-03-14

我正在编写C++来解决这个问题,从leetcode:https://leetcode.com/problems/remove-element/

给定数组nums和值val,移除该值的所有实例并返回新的长度。

不要为另一个数组分配额外的空间,您必须用O(1)个额外内存修改输入数组。

元素的顺序可以更改。你在新长度之外留下什么并不重要。

您的函数应该返回长度=2,nums的前两个元素为2。

在返回长度之外留下什么并不重要。

我有两个解决方案:

解决方案A:

int removeElement(vector<int>& nums, int val) {
    nums.erase(remove(begin(nums), end(nums), val), end(nums));
    return nums.size();
}
int removeElement(vector<int>& nums, int val) {
    auto it = std::remove(nums.begin(), nums.end(), val);
    return it - nums.begin();
}

我不知道为什么remove+eraseremove快。

共有1个答案

韶英达
2023-03-14

对于基本可毁类型的向量(int就是这样一种类型),erase(it,end())通常只是大小成员(或指针成员,取决于实现策略)的减量,几乎不需要时间。4毫秒是非常非常小的差别。它很容易由机器的状态引起。而且我不会指望这么小的差别会是可复制的。

如果您想真正从矢量中删除元素,请使用第一个版本。如果您真的想做std::remove做的事情(您可能不做),那么就使用第二个版本。性能不是这里的问题。

 类似资料:
  • 问题内容: Java在Java 5中引入了带有泛型的类型擦除,因此它们可以在Java的旧版本上使用。这是兼容性的折衷。从那以后,我们就失去了兼容性–字节码可以在JVM的更高版本上运行,但不能在较早的版本上运行。这似乎是最糟糕的选择:我们丢失了类型信息,并且仍然无法在较旧版本上运行针对较新版本JVM编译的字节码。发生了什么? 具体来说,我是在问是否存在任何技术原因,导致无法在下一版JVM中删除类型擦

  • 删除数据 force 设置为true 时,不进行物理删除,只是软删除 model.destroy( { where:{ id:this.ctx.params.id }}, { force: true } ) 恢复所有软删除数据 model.restore() 恢复指定ID数据 model.restore( { where: { id: 2 } } )

  • rm(remove),可以删除目录或文件。 rm 要删除的内容的路径 练习:删除文件 rm ninghao-project/README.md 练习:删除整个目录 上面的命令会删除掉 ninghao-project 目录下的 README.md 这个文件。要删除一个目录里包含的所有内容,要加上 r 选项,想不出现确认提示,还要再加一个 f 选项。 rm -rf ninghao-project

  • 删除容器 可以使用 docker container rm 来删除一个处于终止状态的容器。例如 $ docker container rm trusting_newtontrusting_newton 如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。 清理所有处于终止状态的容器 用 docker container ls -a 命令可以查看所有

  • 模型的删除和数据库的删除方法区别在于,模型的删除会包含模型的事件处理。 删除当前模型 删除模型数据,可以在查询后调用delete方法。 $user = User::get(1); $user->delete(); delete方法返回影响的记录数,V5.1.6+版本开始返回布尔值 根据主键删除 或者直接调用静态方法(根据主键删除) User::destroy(1); // 支持批量删除多个数据 U

  • 请求地址 https://api.es.xiaojukeji.com/river/Member/del 返回数据格式 JSON 请求方式 POST 是否需要登录 是 关于登录授权,参见 如何登录授权 访问授权限制 暂无 请求参数 名称 类型 必选 描述 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的access to