为什么向量持有一个类类型在push_back()时会再次调用复制构造函数?

2023-12-03

我有以下代码:

#include <iostream>
using std::cin; using std::cout; using std::endl;
#include <vector>
using std::vector;

class Quote {
public:
    Quote() = default;
    Quote(const std::string &book, double sales_price):
                     bookNo(book), price(sales_price) {  }
    // Quote(const Quote&) = default;  // memberwise copy
    Quote(const Quote &orig): bookNo(orig.bookNo), price(orig.price) {
        cout << orig.isbn() << endl;
        cout << "called Quote(const Quote &)" << endl;
    }
    Quote& operator=(const Quote&) = default;   // copy assign

    std::string isbn() const { return bookNo; }
    virtual double net_price(std::size_t n) const
                { cout << "Quote::net_price\n"; return n * price; }
    virtual void debug() const { cout << bookNo << ' ' << price << endl; }
    virtual ~Quote() = default;
private:
    std::string bookNo; // ISBN number of this item
protected:
    double price = 0.0; // normal, undiscouted price
};

int main(int argc, char *argv[]) {
    vector<Quote> basket;
    basket.push_back(Quote("0-201-82470-1", 50));
    basket.push_back(Quote("0-201-82XXXXX", 30));
    cout << "\ntraverse bakset" << endl;
    for (const auto &v : basket)
        v.debug();
}

我将上面的代码编译并运行后,结果是:

0-201-82470-1
called Quote(const Quote &)
0-201-82XXXXX
called Quote(const Quote &)
0-201-82470-1
called Quote(const Quote &)

traverse bakset
0-201-82470-1 50
0-201-82XXXXX 30

根据复制构造函数何时被调用,它将被叫两次因为我刚刚推了两个元素push_back()到一个向量。但为什么会这样叫了三遍显示在上面的结果中。
然而,根据 for 循环main,向量的元素是正确的。

为什么复制构造函数在推送到向量时会被再次调用?我定义的复制构造函数有什么问题吗?


当。。。的时候推回第二次调用时,发生了重新分配。 (更准确地说,当新的size()大于capacity().)然后是旧的底层存储vector将被销毁并分配新的,并且需要将元素复制到新存储,这会导致调用复制构造函数。

您可以使用reserve以避免重新分配。例如

vector<Quote> basket;
basket.reserve(2);
basket.push_back(Quote("0-201-82470-1", 50));
basket.push_back(Quote("0-201-82XXXXX", 30)); // no reallocation here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么向量持有一个类类型在push_back()时会再次调用复制构造函数? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags

随机推荐

  • 处理超过 200 个复选框,将它们存储在状态中

    我有一个表 父元素 它获取用户并将每一行呈现为它自己的组件 表中的行包含复选框 目标是能够使用复选框并检索选中的复选框 问题是 当我将函数传递给每一行 子组件 时 触发将选中的复选框值添加到数组 由选定用户的 id 组成 中 整个组件会重新
  • 在共享库的类中调用 GSL 函数

    我正在尝试用 C 创建一个共享库来实现费米气体的工具 我正在使用 GSL 库以数值方式求解函数 并且我的代码在作为脚本运行时运行没有问题 但在尝试将其转换为共享库和类时遇到问题 我见过类似的问题 Q1 Q2 Q3 我对 C 编程相当陌生 似
  • 为什么要在CMake中的add_library/add_executable命令中添加头文件?

    我有一个项目 它使用 CMake 作为构建工具 并制作了一个简单的模板供我和我的同事使用 当我在线搜索最佳且易于使用的实践时 我遇到了创建库的不同方法 在此模板中 我在两个单独的变量中列出了头文件和源文件 并且我没有将标头传递给add li
  • R 中的限制命令?

    R 中的限制命令或函数是什么 我无法通过使用 和 函数搜索或在介绍性手册中找到它 lim 和 limit 不存在 这是在 F X 的极限 X gt Y 的意义上 我不是指任何人编写代码 我指的是任何人 我的意思是 作为安装标准包含在 R 中
  • android 标签图标不显示

    现在我正在尝试让选项卡布局正常工作 我已经完成了所有操作 就像 Android TabView 教程中一样 应用程序运行正常 但问题是我没有看到我在 ic tab artists xml 中定义的任何图标 只有文字 我想这与默认主题或样式或
  • 将 JDBC 与 SQL Server 连接

    我正在尝试将我的 JAVA 代码连接到我本地的 SQL Server 这就是我想要的 public static void main String args throws ClassNotFoundException SQLExceptio
  • 类名中的正则表达式用于识别控件

    某个程序的控件ClassnameNN被识别为AutoIt 窗口信息工具 as WindowsForms10 BUTTON app 0 24f4a7c r27 ad19在以前的版本中 在当前版本中它更改为 WindowsForms10 BUT
  • 安排每周将 Excel 文件下载到唯一的名称

    我们有一个数据库 每周一都会从客户端上传一个 Excel 文件 该文件始终具有相同的名称 因此如果我们忘记了它 就会丢失它 有没有办法制作一个脚本来重命名脚本并为其提供日期或数字 我们现在使用 FileZilla 来获取文件 文件齐拉不允许
  • 设置 pandas 数据框中时间戳数据的时区

    我有一个经常更改的 pandas 数据框 如下所示 date name time timezone 0 2016 08 01 aaa 0900 Asia Tokyo 1 2016 08 04 bbb 1200 Europe Berlin 2
  • Android 应用内结算:“RESULT_DEVELOPER_ERROR”

    我无法理解为什么我在 应用内计费 的实现中收到 RESULT DEVELOPER ERROR 我做了什么 将代码从示例应用程序复制到我的应用程序 android 清单包含 在 Android 4 0 4 和 Google Play 应用程序
  • 确定当前本地时间是否在两个时间之间(忽略日期部分)

    考虑到 Cocoa Touch 中没有 NSTime iPhone 上的 Objective C 并且以 NSString 形式给出两个时间 以 NSString 形式给出一个时区 如何计算当前 LOCAL 时间是否在这两个时间之间 请记住
  • 备份和恢复eMMC

    从 Google Coral 开发板的 SD 卡映像备份板载 eMMC 的过程是什么 同样 我们应该按照什么步骤将镜像恢复到板载的emmc驱动器上呢 从SD卡镜像备份板载eMMC Mendel OS 映像未安装在 SD 卡上 所以您的意思是
  • XAML:访问用户控件内的控件

    我有这样的用户控件
  • SimpleDateFormat 使用“S”格式显示不正确的毫秒,但使用“SSS”时则不显示

    我遇到一个问题 显示的日期的毫秒部分乘以 10 具体来说 时间52 050显示为52 50 when a S使用格式 但是52 050 when a SSS使用格式 采取以下代码示例 Some arbitrary point with 50
  • SmartGwt DateItem useTextField=true - 如何使文本输入字段不可编辑

    因为我不知道如何解决我提出的问题here我暂时在想一个临时的解决办法 我有一个smartgwtDateItem widget DateItem date new DateItem Adate date setWidth 120 date s
  • React.js 中所有者和父组件有什么区别

    React 0 13 带来基于父级的上下文而不是基于所有者的上下文 所以 我不太明白所有者组件和父组件之间的区别 示例将不胜感激 var A React createClass render return b b
  • 重新渲染 rich:dataTable 的特定行

    早上好 是否可以仅重新渲染 rich dataTable 的 1 特定行 我有一个 rich dataTable 当我执行某些操作时 我确信只有 1 行发生了更改 我只需要重新渲染这一行 而不是整个表 是否可以 如何 XHTML
  • 使用海龟模块 exitonclick()

    我的代码应该在第一部分之后关闭turtle screen 然后启动另一个屏幕并执行第二部分 但在那里它没有按预期工作 import turtle ws turtle Screen tod 1 turtle Turtle tod 1 colo
  • UIScrollview获取触摸事件

    如何检测我的触摸点UIScrollView 触摸委托方法不起作用 设置点击手势识别器 UITapGestureRecognizer singleTap UITapGestureRecognizer alloc initWithTarget
  • 为什么向量持有一个类类型在push_back()时会再次调用复制构造函数?

    我有以下代码 include