删除重复项并对向量进行排序的最有效方法是什么?

2023-12-03

我需要获取一个可能包含大量元素的 C++ 向量,删除重复项,然后对其进行排序。

我目前有以下代码,但它不起作用。

vec.erase(
      std::unique(vec.begin(), vec.end()),
      vec.end());
std::sort(vec.begin(), vec.end());

我怎样才能正确地做到这一点?

此外,首先删除重复项(类似于上面的代码)还是先执行排序更快?如果我先执行排序,是否保证在之后保持排序std::unique被执行?

或者是否有另一种(也许更有效)的方法来完成这一切?


我同意R. Pate and 托德·加德纳; a std::set这里可能是个好主意。即使您被困在使用向量中,如果您有足够的重复项,您最好创建一个集合来完成这些肮脏的工作。

让我们比较一下三种方法:

只需使用向量、排序+唯一

sort( vec.begin(), vec.end() );
vec.erase( unique( vec.begin(), vec.end() ), vec.end() );

转换为集合(手动)

set<int> s;
unsigned size = vec.size();
for( unsigned i = 0; i < size; ++i ) s.insert( vec[i] );
vec.assign( s.begin(), s.end() );

转换为集合(使用构造函数)

set<int> s( vec.begin(), vec.end() );
vec.assign( s.begin(), s.end() );

以下是随着重复项数量变化它们的表现:

comparison of vector and set approaches

Summary:当重复的数量足够多时,实际上,转换为集合然后将数据转储回向量会更快.

由于某种原因,手动进行集合转换似乎比使用集合构造函数更快——至少在我使用的玩具随机数据上是这样。

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

删除重复项并对向量进行排序的最有效方法是什么? 的相关文章

随机推荐

  • 如何使用 PyGame 计时器事件?如何使用计时器向 pygame 屏幕添加时钟?

    我是 python 新手 因此决定尝试制作一个简单的游戏pygame 我想添加一个计时器 时钟来显示 你已经玩了 生存了多长时间 所以基本上创建了一个时钟 然而 我四处搜寻并得到了time sleep 1 它确实可以作为时钟使用 但它会减慢
  • 将多个 Intent 从单个 Activity 发送到另一个 Activity

    我对 android 很陌生 我正在尝试将用户输入的数据 他们的名字 发送到另一个活动 我过去能够使用意图在活动之间发送单行 但我无法弄清楚如何将两个不同的字符串发送到两个不同的 TextView 这是到目前为止我的 MainActivit
  • 使用 jQuery 解析 JSON

    我正在尝试使用 jQuery 解析以下 JSON 并获取每个 id 值 有人可以建议吗 id 1 name Boat id 2 name Cable 到目前为止我有 each test function i item alert item
  • 在 R 中查找数组中最接近元素的最快方法

    我想找到 R 中最快的方法来识别 Ytimes 数组中最接近给定 Xtimes 值的元素索引 到目前为止 我一直在使用一个简单的 for 循环 但必须有更好的方法来做到这一点 Xtimes lt c 1 5 8 10 15 19 23 34
  • Swift / 如何使用 popViewController 调用委托

    我读过了这个线程 以及类似的其他 从下到上 但它根本不符合我的需求 我有一个UIViewController inside UIPageViewController在一个UINavigationController 导航到第二个 ViewC
  • C# 事件去抖

    我正在监听硬件事件消息 但我需要对其进行反跳以避免太多查询 这是一个发送机器状态的硬件事件 我必须将其存储在数据库中以用于统计目的 有时它的状态会经常变化 闪烁 在这种情况下 我只想存储 稳定 状态 并且我想通过在将状态存储到数据库之前简单
  • Base64 编码的图像未在 Gmail 中显示

    我有一封嵌入的 HTML 电子邮件 其中我使用base64编码图像 通过 Chrome 访问时 图像不会在 Gmail 中显示 但当通过邮件客户端 Mac 上的邮件应用程序 访问相同的邮件时 它工作正常 我已正确设置标题 任何想法 My c
  • 如何从 WCF 中的客户端消息检查器获取标头值

    我正在为我正在处理的某些服务创建一个 Web 测试客户端 作为其要求的一部分 我希望能够显示完整的请求和响应 SOAP 消息 以及向用户显示的 HTTP 标头 我实现了一个 MessageInspector 类实现IClient消息检查器
  • C# 如何在按住鼠标按钮时循环

    你能为我指出正确的方向吗 我试图在按下表单按钮时触发循环 pseudocode While button1 is pressed value1 1 当然 当释放按钮时停止循环 为了避免使用线程 您可以添加Timer表单 控件上的组件 只需在
  • 如何使用Hibernate将初始数据导入数据库?

    在部署应用程序时 我经常使用 Hibernate 的创建数据库模式的功能来简化部署 通过配置 hibernate hbm2ddl auto 属性可以轻松实现这一点 但是 有时我还需要向数据库插入一些初始数据 例如 root 用户 有没有办法
  • 如何从 JSON 对象中删除条目?

    helper to turn PSCustomObject into a list of key value pairs function Get ObjectMembers CmdletBinding Param Parameter Ma
  • Android 获取设备中已安装的默认浏览器

    我能够在启动器的帮助下获取所有应用程序Intent CATEGORY LAUNCHER 因此 为了进行测试 我创建了一个测试活动 该活动包含一个按钮 如果我按下该按钮 它应该显示设备中的应用程序 NOTE it should not dis
  • VB.NET:“MySql.Data.MySqlClient.Replication.ReplicationManager”的类型初始值设定项引发异常

    我不知道可能出了什么问题 但这就是我尝试启动该程序时得到的结果 类型初始值设定项MySql Data MySqlClient Replication ReplicationManager抛出异常 问题似乎来自conn Open 这是我的代码
  • 查找排序数组并集中的第 k 个最小元素

    我正在研究关于在两个排序数组的并集中查找第 k 个最小元素的文章leetcode 我不认为该算法是正确的 有这样一行 我们观察到 当 Ai 对于任何一个人来说 这怎么可能是真的呢 i and j 其次 这句话也让我困惑 我们尝试通过比较 A
  • 安装 RMySQL 会出现错误 RS-MySQL.h:32:19: fatal error: mysql.h: No such file

    我尝试安装 RMySQL 库 R 版本 2 14 2 32 位 WinXP 但收到以下错误消息 install packages D R library RMySQL 0 9 3 tar gz repos NULL type source
  • matplotlib 中是否存在用于在子图中定义子图网格的工具?

    我想使用一个绘图布局 其中 9 个不同的数据簇布置在方形网格上 网格中的每个方框包含 3 个并排布置的箱线图 我最初的想法是 这适合 3x3 子图布局 每个单独的子图本身都分为 3x1 子图布局 我见过这个 在 matplotlib 的子图
  • 3D 线-平面相交

    如果给定一条线 由一个向量或线上的两个点表示 如何找到该线与平面相交的点 我已经找到了大量关于这方面的资源 但我无法理解那里的方程 它们似乎不是标准代数 我想要一个可以用标准编程语言 我使用的是Java 解释的方程 无论多长 下面是一个查找
  • 使用提升的权限通过批处理文件运行 Powershell 脚本

    我需要运行 Powershell 脚本来通过批处理文件创建 AD 用户 问题是我需要以提升的权限 域管理员帐户 运行此 PS 脚本 我尝试编写一个包含所有这些信息的 bat 文件脚本 但到目前为止我还没有成功 这是脚本 echo off c
  • XSLT 无法根据值对节点进行分组/排序

    我正在尝试转换这个 xml 但是我遇到了格式问题 有人可以指导我解决这个问题吗 提前致谢
  • 删除重复项并对向量进行排序的最有效方法是什么?

    我需要获取一个可能包含大量元素的 C 向量 删除重复项 然后对其进行排序 我目前有以下代码 但它不起作用 vec erase std unique vec begin vec end vec end std sort vec begin v