为什么向量持有一个类类型在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()时会再次调用复制构造函数? 的相关文章

  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

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

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 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
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

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

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • Unity,c++ 本机插件字节数组不匹配

    在我的 C 本机插件中 我有一个调用 vector
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • Emacs C++,打开相应的头文件

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

随机推荐

  • 处理超过 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