如何在 C++ 中将数组的内容复制到 std::vector 而不循环?

2024-01-05

我有一个值数组,它从程序的不同部分传递到我的函数,我需要存储这些值以供以后处理。由于我不知道在处理数据之前我的函数会被调用多少次,所以我需要一个动态存储结构,所以我选择了一个std::vector。我不想必须执行标准循环push_back所有值都是单独的,如果我可以使用类似的东西复制所有值,那就太好了memcpy.


这里有很多答案,几乎所有答案都可以完成工作。

然而,有一些误导性的建议!

以下是选项:

vector<int> dataVec;

int dataArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
unsigned dataArraySize = sizeof(dataArray) / sizeof(int);

// Method 1: Copy the array to the vector using back_inserter.
{
    copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}

// Method 2: Same as 1 but pre-extend the vector by the size of the array using reserve
{
    dataVec.reserve(dataVec.size() + dataArraySize);
    copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}

// Method 3: Memcpy
{
    dataVec.resize(dataVec.size() + dataArraySize);
    memcpy(&dataVec[dataVec.size() - dataArraySize], &dataArray[0], dataArraySize * sizeof(int));
}

// Method 4: vector::insert
{
    dataVec.insert(dataVec.end(), &dataArray[0], &dataArray[dataArraySize]);
}

// Method 5: vector + vector
{
    vector<int> dataVec2(&dataArray[0], &dataArray[dataArraySize]);
    dataVec.insert(dataVec.end(), dataVec2.begin(), dataVec2.end());
}

长话短说,方法 4(使用 vector::insert)最适合 bsruth 的场景。

以下是一些血淋淋的细节:

Method 1可能是最容易理解的。只需复制数组中的每个元素并将其推入向量的后面即可。唉,慢了。因为存在循环(由复制函数隐含),所以必须单独处理每个元素;由于我们知道数组和向量是连续的块,因此无法提高性能。

Method 2是对方法 1 的建议性能改进;只需在添加数组之前预先保留数组的大小即可。对于大型数组这might帮助。然而,这里最好的建议是永远不要使用保留,除非分析表明您可能能够获得改进(或者您需要确保您的迭代器不会失效)。比亚恩同意 http://www.research.att.com/~bs/bs_faq2.html#slow-containers。顺便说一句,我发现这个方法执行了slowest大多数时候,尽管我很难全面解释为什么它会定期发生显著地比方法1慢...

Method 3是老派的解决方案 - 扔一些 C 来解决这个问题!对于 POD 类型运行良好且快速。在这种情况下,需要调用 resize,因为 memcpy 在向量范围之外工作,并且无法告诉向量其大小已更改。除了是一个丑陋的解决方案(字节复制!)之外,请记住,这可以仅用于 POD 类型。我永远不会使用这个解决方案。

Method 4是最好的方法。它的含义很明确,它(通常)是最快的并且适用于任何对象。对于此应用程序使用此方法没有任何缺点。

Method 5是对方法 4 的调整 - 将数组复制到向量中,然后附加它。不错的选择 - 通常快速且清晰。

最后,您知道可以使用向量代替数组,对吧?即使函数需要 C 样式数组,您也可以使用向量:

vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C++ 中将数组的内容复制到 std::vector 而不循环? 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 将 Javascript 注入 Webview - Swift

    加载一些自定义 html 后 如何将 javascript 注入到 webview IOS Swift 中 IBOutlet weak var webView UIWebView var html div div self webview
  • UIGestureRecognizer 阻止子视图处理触摸事件

    I m trying to figure out how this is done the right way I ve tried to depict the situation 我正在添加一个UITableView作为 a 的子视图UI
  • 网络检查器下资源加载之间的空白时间

    我一直在开发一个新网站并练习我的 JS jQuery AJaxy 技能 昨晚 我想看看页面渲染需要多长时间 看看是否有任何区域可以清理以提高速度 虽然页面每次加载时间约为 200 300 毫秒 但我在网络检查器下的资源加载之间看到大量空白
  • 如何在 `git merge` 之后使用 `git rebase -i` 而不会弄乱事情?

    我有以下情况 我对本地存储库进行了一些提交 然后将另一个分支 约 150 次提交 大量合并到主分支中 这里面有很多冲突 现在 我想将合并之前所做的提交移到推送之前的提交之后 通常情况下 我会使用rebase i for it 不幸的是 默认
  • 如何将代码片段嵌入到对话中?

    我不知道如何将代码片段嵌入到我的对话中 如下所示 从谷歌我找到了一些教程 例如 嵌入式代码片段简介 https github blog 2017 08 15 introducing embedded code snippets 嵌入代码片段
  • AngularJS:如何使用自定义 HTML 将 ui-grid 数据导出到 Excel?

    与此链接相关 AngularJS 如何将 ui grid 数据导出到 Excel https stackoverflow com questions 40265774 angularjs how to export ui grid data
  • 将 AngularJS 表单发送到 NodeMailer 以发送电子邮件

    我使用 AngularJS 在模态实例中构建了一个电子邮件表单 其中包含发送电子邮件 收件人电子邮件 主题和电子邮件内容的字段 该表单使用输入框和 ng models 来跟踪数据 当用户点击此表单上的发送按钮时 我想将模型收集的所有信息发送
  • Python 中的不可变列表

    我试图制作一个在整个应用程序中使用的不可变列表 我认为将这个列表包装在一个元组中可以解决问题 但似乎tuple list 实际上并不换行 而是复制列表元素 gt gt gt a 1 2 3 4 gt gt gt b tuple a gt g
  • 如何检测和删除(在会话期间)无法进行垃圾收集的未使用的 @ViewScoped beans

    编辑 这个问题提出的问题在 codebulb ch 的这篇文章中得到了很好的解释和证实 包括 JSF 之间的一些比较 ViewScoped CDI ViewSCoped 以及全能面孔 ViewScoped 并明确声明 JSF ViewSco
  • opengl:glFlush() 与 glFinish()

    我无法区分调用之间的实际区别glFlush and glFinish 文档说glFlush and glFinish 将把所有缓冲操作推送到 OpenGL 以便可以确保它们都会被执行 区别在于glFlush 立即返回 其中glFinish
  • 不使用扫描仪在控制台中获取用户输入

    我想知道使用其他类从用户那里获取输入的其他方法BufferedReader等而不是使用 Scanner 类 那么 还有其他方式获取用户的输入吗 如果是这样 它比Scanner class 如果您使用的是 Java SE6 或更高版本 那么您
  • netbeans 无法解析标识符 c_str

    大家好 我最近从 Qt Creator 切换到 NetBeans 我对这个决定感到遗憾 这是我遇到的有关编译器错误等的最新 许多 问题 上期及MinGW64编译器安装 https stackoverflow com questions 41
  • 在运行时在 Windows 窗体上找到 ErrorProvider

    我正在制作一个扩展方法库以在 Windows 窗体应用程序中使用 我打算创建的方法之一将使在输入控件上设置错误状态变得更容易 例如 public static void SetError this System Windows Forms
  • Google Maps Android API V2 遮蔽了部分布局

    我正在尝试将 Google Maps Android API v2 集成到我的 Android 应用程序中 我将 Google 地图放在布局的中间 当布局能够适合屏幕时它效果很好 但是当布局太大而无法容纳并且用户向下滚动以查看其余内容时 布
  • Jquery:当用户单击除该 div 之外的任何内容时如何隐藏该 div。无叠加

    我在想 one在这种情况下会有用吗 但我不知道该怎么做 当我单击搜索链接时 会出现一个搜索框 我希望用户能够单击该 div 中的任何内容而不关闭它 但是当用户单击该 div 之外的任何内容时 div 就会淡出 嗯 这是一个example h
  • 使用数组的矩阵乘法

    我正在尝试使用多维数组创建一个简单的矩阵乘法方法 2 2 我对此有点陌生 我只是找不到我做错了什么 如果有人帮助我告诉我它是什么 我真的很感激 我不想使用库或类似的东西 我这样做主要是为了了解它是如何工作的 预先非常感谢您 我在 main
  • 更新并返回 Mongodb 中的文档

    我想要获取更新的文档 这是我的原始代码 它成功更新但不返回文档 collection update code req body code set req body updatedFields function err results res
  • Django - 在将文本保存到数据库之前如何修改文本?

    我想输入类似的内容 通过管理页面 text t es t 并将它们另存为 test 在数据库上 我使用这个正则表达式来修改它们 re sub r 1 1 r 1 2 3 text 我知道如何转换文本 t es t to test 但问题是
  • 无法获得 html div 元素周围的边框

    我不明白为什么我的 div 周围没有边框 我的jsfiddle是 http jsfiddle net 4HnKs 1 http jsfiddle net 4HnKs 1 我一定是因为盯着电脑屏幕而疯了 但如果你看看课堂上的情况vertica
  • 如何在 C++ 中将数组的内容复制到 std::vector 而不循环?

    我有一个值数组 它从程序的不同部分传递到我的函数 我需要存储这些值以供以后处理 由于我不知道在处理数据之前我的函数会被调用多少次 所以我需要一个动态存储结构 所以我选择了一个std vector 我不想必须执行标准循环push back所有