如何从给定索引列表的 std::vector 中删除项目

2024-02-28

我有一个项目向量items,以及应该从中删除的索引向量items:

std::vector<T> items;
std::vector<size_t> indicesToDelete;

items.push_back(a);
items.push_back(b);
items.push_back(c);
items.push_back(d);
items.push_back(e);

indicesToDelete.push_back(3);
indicesToDelete.push_back(0);
indicesToDelete.push_back(1);

// given these 2 data structures, I want to remove items so it contains
// only c and e (deleting indices 3, 0, and 1)
// ???

执行删除的最佳方法是什么,因为每次删除都会影响其中的所有其他索引indicesToDelete?

有几个想法是:

  1. Copy items一次指向一个新向量,如果索引位于则跳过indicesToDelete
  2. Iterate items对于每次删除,减少中的所有项目indicesToDelete哪个有更大的指数。
  3. Sort indicesToDelete首先,然后迭代indicesToDelete,并且对于每个删除增加一个indexCorrection从后续索引中减去它。

看来我是想太多了,这样一个看似微不足道的任务。还有更好的想法吗?


Edit这是解决方案,基本上是#1 的变体,但使用迭代器来定义要复制到结果的块。

template<typename T>
inline std::vector<T> erase_indices(const std::vector<T>& data, std::vector<size_t>& indicesToDelete/* can't assume copy elision, don't pass-by-value */)
{
    if(indicesToDelete.empty())
        return data;

    std::vector<T> ret;
    ret.reserve(data.size() - indicesToDelete.size());

    std::sort(indicesToDelete.begin(), indicesToDelete.end());

    // new we can assume there is at least 1 element to delete. copy blocks at a time.
    std::vector<T>::const_iterator itBlockBegin = data.begin();
    for(std::vector<size_t>::const_iterator it = indicesToDelete.begin(); it != indicesToDelete.end(); ++ it)
    {
        std::vector<T>::const_iterator itBlockEnd = data.begin() + *it;
        if(itBlockBegin != itBlockEnd)
        {
            std::copy(itBlockBegin, itBlockEnd, std::back_inserter(ret));
        }
        itBlockBegin = itBlockEnd + 1;
    }

    // copy last block.
    if(itBlockBegin != data.end())
    {
        std::copy(itBlockBegin, data.end(), std::back_inserter(ret));
    }

    return ret;
}

我会选择 1/3,即:对索引向量进行排序,在数据向量中创建两个迭代器,一个用于读取,一个用于写入。将写入迭代器初始化为要删除的第一个元素,并将读取迭代器初始化为超出该元素的元素。然后在循环的每个步骤中将迭代器递增到下一个值(写入)和下一个不被跳过的值(读取)并复制/移动元素。在循环调用结束时erase丢弃最后写入位置之外的元素。

顺便说一句,这是在删除/删除_ifSTL 的算法,不同之处在于您将条件维护在单独的有序向量中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从给定索引列表的 std::vector 中删除项目 的相关文章

  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • 无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到

随机推荐

  • 自定义 RES 屏幕和 RES 图标已替换为默认的 Cordova 屏幕和图标

    我正在使用适用于 Apache Cordova 的 Visual Studio 工具 我已经测试了 CLI 6 4 0 不幸的是 RES 屏幕和 RES 图标存在错误 如果我使用 CLI 6 3 1 这个问题就会消失 为了演示它 我从头开始
  • 有没有可以阅读 ePub 书籍的 API? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试为 WP7 创建电子书阅读器 到目前为止 我还没有找到任何 API 来阅读 ePub 书籍 谢谢 扎因 对于基于 DRM fre
  • 列的数据被截断?

    更改 MySql 列的数据类型以存储后Twilio 通话 https www twilio com docs api rest call ids 34 个字符字符串 我尝试使用以下命令手动更改该列中的数据 update calls set
  • 如何在带有 View Holder 的自定义 ListView 中使用 Button OnClick

    我需要一些帮助 我正在使用视图保持器从动态数组适配器显示 我有列表视图 每行包含 标题 文本视图 副标题 TextView 进度条 下载按钮 按钮 我想在单击下载按钮时显示进度栏并隐藏下载按钮 单击第一行的下载按钮时 会显示第一个进度条 但
  • 如何在glmnet中指定日志链接?

    我正在使用 R 中的 glmnet 和 caret 包在广义线性模型上运行弹性网络 我的响应变量是成本 其中成本 gt 0 因此我想为我的 GLM 指定一个带有日志链接的高斯族 然而 glmnet 似乎不允许我指定 link log 如下
  • freeglut 与 glew 的区别?

    我最近开始学习 OpenGL gt 3 3 并且我注意到很多示例和教程都使用 freeglut 和 glew 但根本没有真正解释其中的区别 在谷歌搜索和阅读令人作呕的内容之后 我发现的最好的描述是这样的OpenGL相关工具包和API htt
  • 无法使用本地 hadoop 连接 azure blob 存储

    在尝试连接时本地hadoop与AZURE BLOB存储 即使用作为 HDFS 的 Blob 存储 和 Hadoop 版本 2 7 1 它抛出异常 这里我已经通过设置属性成功形成了本地集群
  • 我可以更新 INT 值 + 1 并返回新值吗?

    MySQL PHP 是否可以在一次查询中增加 INT 值并返回新值 sql mysql query UPDATE table SET number number 1 WHERE id uniqid updated number 或者我需要发
  • SQL Azure 和 Azure 表存储如何比较? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何检查 Ubuntu 上是否正在运行一个我不知道名称的服务

    我不知道该服务的名称 但想通过检查其状态来停止该服务 例如 如果我想检查是否PostgreSQL http en wikipedia org wiki PostgreSQL服务是否正在运行 但我不知道服务的名称 那么如何检查其状态 如果服务
  • 如何在 Swift 中分配/释放不安全指针?

    在 Beta 4 中 我的代码运行良好 var red green blue alpha UnsafePointer
  • 仅当字符串中的第 n 个字符是 R 中的特定字符时才替换它

    我正在将一系列调查导入为 csv 文件并组合成一个数据集 问题在于七个文件之一的某些变量的导入略有不同 数据集很大 我想找到一种方法来编写一个函数来运行给我带来麻烦的数据集 在某些变量中 应该有点的时候却有下划线 并非所有变量都具有相同的格
  • 在我的 Flex 应用程序中获取数据的最佳方式是什么?

    我是 Flex 开发新手 在创建新的移动项目时 它询问我是否要将其连接到某些服务器 并给了我四个选项 ColdFusion PHP Java 和 blazeDS 我一直在 java 工作 而不是 PHP 人员 我会简单地选择Java并忽略了
  • 变量未在 PHP 循环中传递/更新

    所以基本上我正在做的是创建 php 脚本 该脚本打印表格并根据表单中输入的内容更新和计算值 所以我有一个单独的 HTML 文件 其中包含表单 它传递 3 个变量 tempStart tempEnd windSpeed 然后我创建了一个在表的
  • 在 Eclipse 帮助中搜索 RCP 未返回任何结果

    我有一个 RCP 应用程序 并在菜单上启用了帮助 我能够成功调出我创建的帮助 但是 当我输入搜索词时 没有返回结果 需要什么才能从 Eclipse 帮助引擎搜索我的帮助内容 解决方案是使用帮助内容更新插件的版本号以重建索引 我依赖 qual
  • VS2010 构建后事件,替换文件中的字符串。电源外壳?

    在 VS2010 中成功构建后 我需要替换缩小的 js 文件中的简单字符串 因此 我尝试从 构建后事件 窗口运行一个简单的命令行调用 这个例子 来自这里 https blogs technet com b heyscriptingguy a
  • Polymer 中的横向通信

    问题是这样的 任何两个聚合物元素都可能需要通信 没有假设这些元素可能位于 DOM 或影子 DOM 中的位置 这意味着一个事件不能简单地冒泡到另一个元素 实现这一点的好旧方法是让事件冒泡到根节点 然后触发播送根节点上的事件供其他元素监听 然而
  • 如何在sklearn中找到多个节点的最近邻居?

    所以基本上我正在开发一个推荐系统 其中用户可以选择多个电影 节点 并给出与用户选择的所有电影 节点 相似的推荐 为了做到这一点 我需要同时找到这些多个节点的最近邻居 即结果应该接近node1 and node2 我怎样才能做到这一点 X 0
  • 构建规则中的 Bazel 环境变量

    我想参考 DirectX SDKBUILD文件 问题是 据我所知 Bazel 仅支持通过 action env DXSDK DIRBazel 的参数 它应该在动作中使用 必须在插件中定义 bzl file 有没有更简单的方法通过将环境变量用
  • 如何从给定索引列表的 std::vector 中删除项目

    我有一个项目向量items 以及应该从中删除的索引向量items std vector