为什么 std::vector::insert 需要复制赋值?

2024-03-28

我试图理解以下行为:

#include <vector>
#include <iterator>    

struct Foo {
    Foo(int a) : a_ {a} {}
    const int a_; // Note the const
};

int main(int argc, char **argv) {
    std::vector<Foo> v1 {Foo {0}};
    std::vector<Foo> v2 {Foo {1}};

    auto first = std::begin(v2);
    auto last  = std::end(v2);

    for (; first != last; ++first) {
        v1.push_back(*first); // Fine
    }

    //v1.insert(v1.begin(), first, last); // Does not compile

    return 0;
}

事实证明const成员Foo被隐式删除Foos 复制赋值运算符,其中std::vector::insert used.

为什么std::vector::insert需要复制分配std::vector::push_back复制构造?这是否意味着手动连接两个向量可以更有效?这是使用 LLVM。


从逻辑上讲,没有理由需要赋值运算符。这insert完全可以通过移动任何现有元素来实现操作vec[x] to vec[x+1]通过(大致)使用vec[x+1].~T(); new(&vec[x+1]) T(std::move(vec[x]));在循环中销毁现有元素,并使用就地构造将前一个元素向前移动。

然而,一种更自然的编写方法是使用赋值来实现这一点,在设计良好的类中,即使不是更高效,至少也同样有效:vec[x+1] = std::move(vec[x]);。一个简单的例子说明何时可以更有效,如果向量元素的构造和销毁涉及分配和释放内存:使用赋值可以轻松绕过这一点。

我们决定允许向量使用赋值运算符利大于弊。你们的班级很不寻常,而你们的班级恰好没有从这个决定中受益。不幸的是,但没有办法设计出适合每个用例的向量。

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

为什么 std::vector::insert 需要复制赋值? 的相关文章

  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • c++11 正则表达式比 python 慢

    嗨我想了解为什么以下代码使用正则表达式进行分割字符串分割 include
  • C++ 模板中的名称查找

    我有一些 C 代码 如果没有 fpermissive 选项 就无法再编译 这是我无法分享的专有代码 但我认为我已经能够提取一个简单的测试用例来演示该问题 这是 g 的输出 template eg cpp In instantiation o
  • gtest 和 gmock 有什么区别?

    我试图理解的目的google mock Google 的 C 模拟框架 https github com google googletest blob master googlemock README md 我已经与gtest较早 但我还是
  • asp.net c# 将数据集中的数据转换为电子邮件正文?

    从数据集到电子邮件正文的最佳方式是什么 我有一个 net 控制台应用程序 用于根据存储过程的结果发送电子邮件通知 并且想知道如何最好地从 SQL 数据转到电子邮件正文 带有颜色和字体的 html 正文是最好的 但纯文本也可以 thanks
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • 使用静态类型代替变量

    当您的项目不使用命名空间时 有什么方法可以告诉编译器使用静态类型而不是变量吗 例如 我有一个名为 User 的类 它具有各种静态和非静态方法 假设调用了其中一个静态方法GetUser 我想称之为User GetUser 方法来自一个方法 该
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • Azure 2012 年 10 月 SDK 损坏 UseDevelopmentStorage=true

    有人尝试过使用 usedevelopmentstorage true 连接字符串的 2012 年 10 月 Azure sdk 吗 CloudStorageAccount Parse UseDevelopmentStorage true 抛
  • 使用成员作为实现者来实现接口

    我有实现 IA 的 A 类 现在我需要创建也应该实现 IA 的类 B B 类有 A 类的实例作为成员 有什么方法可以定义A的实例实现B类中的IA吗 interfase IA void method1 void method2 void me
  • C 中“for”循环中的两个变量

    我正在编写一些代码 需要在其中使用两个变量for环形 下面的代码看起来没问题吗 它确实给了我预期的结果 for loop 1 offset loop 2 offset 2 loop 1 gt offset 190 loop 2 lt 190
  • 枚举器上的 [[maybe_unused]]

    查看规格 maybe unused http en cppreference com w cpp language attributes 它指出 出现在类 typedef 变量 非静态数据成员 函数 枚举或枚举器的声明中 如果编译器对未使用
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • Active Directory UserPrincipal.Current.GetGroups() 返回本地组而不是 Web 服务器上的组

    以下内容在我的本地开发盒上效果很好 但是 当我将其移动到网络服务器时 它失败了 甚至不会记录错误 public static List
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • double 类型的静态类成员的常量表达式初始值设定项

    在 C 11 和 C 14 中 为什么我需要constexpr在下面的代码片段中 class Foo static constexpr double X 0 75 而这会产生编译器错误 class Foo static const doub
  • 编译器可以报告未知属性的错误吗?即使有范围?

    在N3291 7 6 1 3 5 属性语法和语义 decl attr grammar 关于如何属性是用我读过的源代码写的 使用一个属性范围令牌是有条件支持的 实现定义的行为 and For an 属性标记本国际标准中未指定 该行为是实现定义
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐

  • 异步nodejs查询和处理结果

    我有一个从 mongodb 获取的对象数组 数组中的每个元素都是一篇文章 作者为 user id 现在我希望找到与 user id 相关的用户信息 由于节点使用异步方法从数据库查找数据 因此 forEach 循环在回调完成之前完成 docs
  • 使用邮件规则和 Applescript 将 vcard 添加到联系人

    我通过特定的电子邮件地址收到了很多客户电子名片 我想通过邮件规则和 AppleScript 自动将电子名片添加到我的联系人中 我搜索了很多并找到了一些东西 我稍微修改了一下 并且打开和添加过程运行良好 但只有当我选择一个文件时 我无法将文件
  • 防止 DOMDocument::loadHTML() 转换实体

    我有一个字符串值 我正在尝试为其提取列表项 我想提取文本和任何子节点 但是 DOMDocument 正在将实体转换为字符 而不是保留原始状态 我尝试将 DOMDocument resolveExternals 和 DOMDocument s
  • opencv中的骨架化

    opencv中有没有可以使用的特定函数来进行骨架化 另外 我搜索了一段时间 想知道opencv是否实现了voronoi 骨骼 似乎有 但真的是 看起来 Voronoi Skeleton 是在 cvConstructSkeleton and
  • HTML5网络存储:不同网站可以互相覆盖用户计算机上的数据吗?

    我有一些关于 HTML5 存储概念的问题 我浏览了 w3c 规范 书籍和教程 但我仍然对某些概念有点不清楚 假设我访问网站 A 一些 JavaScript 在我的浏览器中运行 用于设置键值对 例如 username deepak 然后我访问
  • 从选择标签中的数据库获取值 HTML PHP MySQL [重复]

    这个问题在这里已经有答案了 我是 PHP MySQL 的初学者 我成功地从数据库中获取了值INPUT类型 但我无法从数据库中获取数据SELECT type 这是我的示例编辑表单 其中Gender 用户类型无法从我的数据库输出值 and he
  • 如何将雪花中单词的第一个字母大写?

    我需要在 Snowflake 中将 mySQL 查询中某些单词的首字母大写 我目前正在使用这个功能 SELECT case when FLAG1 is null then upper FLAG2 else FLAG1 END as STAT
  • 为什么新的 gradle 测试过滤功能不适用于我的构建脚本?

    我正在开发一个具有以下结构的 项目 proj dbfit junit module db1 db2 提供一些背景信息 所有这些 模块 db1 db2 都有 JUnit 测试 这些测试使用 FitNesseRunner 将它们集成到 Bamb
  • 某些图像无法在 IE7 或 IE8 中显示

    我不明白为什么这个图像 以及其他类似的图像 不会在 IE7 或 IE8 中显示 它在 IE9 Chrome Safari Firefox Mac 或 PC 以及这些浏览器的多个版本中完美显示 http images appletree co
  • Google Cloud CDN 开始忽略存储桶的查询字符串

    几个月前 为存储桶激活了 Cloud CDN 我们的存储数据会通过后端定期更改 因此 为了使缓存版本无效 我们添加了一个查询参数changedDate到提供给客户端的 url 当时这很有效 在过去几个月 可能是几周 的某个时候 谷歌似乎改变
  • 如何在 Python 中使用日期时间和 scipy 峰值绘制绘图?

    我从一个问题中举了一个例子 并将其适应我的数据集 但当涉及到绘制绘图时 我陷入了困境 我知道如何制作日期时间 值图 但我不知道如何进行组合 我得到的答复如下 Response https datascience stackexchange
  • 部署套件建议[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 Net 4 0 下编写了一些应
  • iOS 8 代码适用于 iPhone 5s,但不适用于 iPhone 5

    在 iPhone 5s 模拟器上一直测试我的 spritekit 游戏后 我终于尝试在 iPhone 5 模拟器上运行它 不幸的是 当我第一次触摸时 我就收到了一个我不明白的错误 我的touchesBegan函数调用我的addCoin函数
  • React router dom将数据从父组件传递到子路由器组件不传递props.match

    父组件App js的内容 import React useEffect useState from react import NavBar from components NavBar import Signup from pages Si
  • 如何使 formControl 只读

    如何以角度只读方式制作表单控件 我知道我可以用 html 来做
  • Numpy 索引重新排序数组

    我刚刚偶然发现了一个我不太理解的 numpy 索引行为 看起来 numpy 正在根据索引模式改变我的轴的顺序 不幸的是 我在文档中找不到以下内容的解释 有人可以向我解释一下发生了什么事吗 This is expected dimension
  • SignalR 响应覆盖标头

    我构建了一个位于 WebAPI 服务中的简单 SignalR 中心 并在 WebAPI 和 SignalR 上包含了所有必需的 CORS 属性 我的 WebAPI 端点都按预期工作 但 SignalR 却没有 我已经尝试了我能想到的所有方法
  • C中使用函数计算数组长度

    我想创建一个函数来计算传递数组的大小 我将传递一个数组作为输入 它应该返回其长度 我想要一个函数 int ArraySize int Array Or int Array Calculate Length of Array and Retu
  • Dash Python 应用程序按钮用于操作和刷新页面

    Dash App 中需要有一个回调函数来执行某些操作然后刷新页面 只能使用 HTML A 标签实现页面重新加载 html A html Button Refresh Data href 必需的 app layout html Div htm
  • 为什么 std::vector::insert 需要复制赋值?

    我试图理解以下行为 include