STL容器如何复制对象?

2024-05-01

我知道 STL 容器,比如vector添加对象时复制该对象。push_back方法如下:

void push_back ( const T& x );

我很惊讶地发现它把该项目作为参考。我编写了一个示例程序来看看它是如何工作的。

struct Foo
{
    Foo()
    {
        std::cout << "Inside Foo constructor" << std::endl;
    }

    Foo(const Foo& f)
    {
        std::cout << "inside copy constructor" << std::endl;
    }
};

Foo f;
std::vector<Foo> foos;
foos.push_back(f);

这会复制对象,我可以看到它正在调用复制构造函数.

我的问题是,当push_back以item为参考,它是如何调用复制构造函数的?或者我在这里遗漏了什么?

有什么想法吗..?


它可能使用“放置new" 在其内部数组中就地构造对象。new不分配任何内存;它只是将对象放置在您指定的位置,然后调用构造函数。语法是new (address) Class(constructor_arguments).

复制构造函数T::T(T const &)被调用以就地创建副本。像这样(简化):

template<T>
void vector<T>::push_back(T const &item) {
    // resize if necessary
    new (&d_array[d_size++]) T(item);
}

注意T必须有一个复制构造函数才能工作。默认情况下(如果您什么都不做),它会免费获得一个。如果明确定义它,则必须是public for vector<T>上班。

GNU 的 libstdc++ 是这样做的 http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01011_source.html#l00721,但我怀疑这是否会很有启发。有一个分配器(第二个模板参数vector)这使得它变得不那么简单。

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

STL容器如何复制对象? 的相关文章

随机推荐

  • 在不同的 PC 之间传输 Python 设置

    我的情况是我有两台笔记本电脑fresh installation of windows 现在我用它们来编程 所以 假设我在一台笔记本电脑上安装了各种 python 模块 包 那么我有什么办法可以clone我的另一台笔记本电脑上的完整 pyt
  • ValueError:BitVect 的长度必须相同(rdkit)

    我正在计算 2 个摩尔之间的结构相似性概况rdkit 当我在 google colab 中运行程序时 rdkit 2020 09 2 python 3 7 程序运行良好 当我在 PC 上运行时出现错误 rdkit 2021 03 2 pyt
  • Cloudformation 模板 - 具有 cloudfront 分发的 S3 存储桶网站 - 分发无法访问源

    我只是想在 S3 存储桶上获取一个静态站点 并且只能通过 CloudFront 发行版访问它 但是缺少一些东西 我不知道是什么 目前我的堆栈有 用于站点托管的 S3 存储桶 用于为站点提供服务的云前端发行版 存储桶策略 仅允许分配访问该存储
  • AJAX 以渐进方式读取数据,而不仅仅是在完成时读取数据

    我喜欢为我的 ajax 调用创建一个进度条 为此 我可以使我的服务器端脚本返回其进度状态 所以我需要 JavaScript 来读取这个进度级别并显示它 有可能吗还是我走错了路 你可以尝试这样的事情 一些伪代码 假设是 jQuery 因为你已
  • 如何以编程方式将数据写入Azure Blob存储?

    我正在使用下面的 PowerShell 脚本通过 REST API 调用从源读取 JSON 数据 现在我想将 Result 的数据加载到 Azure Blob 存储中 有什么想法吗 Params URI https 3ea5e53b 817
  • Apache:配置应用程序侦听器时出错

    当我尝试运行该应用程序时 我遇到了这个问题 警告 SetContextPropertiesRule Context 设置属性 源 到 org eclipse jst j2ee server CongressApp 没有找到匹配的 财产 20
  • 运行时签名是什么?

    当涉及到有界类型时 我对 Java 的类型擦除有一些理解上的问题 考虑一下 class Event From the API class FooEvent extends Event abstract class Foo
  • 带参数的多重继承

    我已经阅读了很多有关继承的内容 但我似乎无法理解为什么这会给我一个错误 使用Python 2 7 x class A object def init self value super A self init print First s va
  • 是否可以使用 jQuery 从 SQL Server 检索数据?

    是否可以使用 jQuery 从 SQL Server 检索数据并使用 HTML 控件显示数据 jQuery 被设计为在浏览器环境中运行 所以这是一个具有 DOM 的环境 具有 JavaScript 支持 显然 等等 要从 MS SQL Se
  • 将参数内的日期转换为整数

    现在我有一个存储过程 它将日期作为integer 140213 但在SSRS我需要转换在date parameter to the integer前面提到过 现在我试图通过两个参数 日期和转换 来实现这一目标 一个参数允许您选择日期 第二个
  • 如何在本机反应中获取元素的宽度?

    如何获取 React Native 中元素的宽度 例如 View 由于React Native中没有宽度的百分比使用 如何获取元素或父元素的宽度 您可以致电onLayout测量元素的事件 measureView event console
  • 如何动态添加JSF组件

    我可以动态添加 JSF 组件吗 我需要一个带有按钮的表单 该按钮应该添加一个
  • NSFetchRequest 不返回任何内容

    任何人都可以发现为什么这不返回任何 ManagedObjects 吗 我试图将以下内容添加到 ATNSManagedObject EasyFetching 类中 但获取结果不返回任何内容 如果我在 EasyFetch 类之外获取这些对象 我
  • PL/SQL 中是否有方法将文本转换/编码为 XML 兼容文本?

    我的一位同事需要将 PL SQL 方法中的文本转换为符合 XML 的文本 因为他正在通过更新文本模板来构建 Excel 电子表格 PL SQL 中是否有方法将文本转换 编码为 XML 兼容文本 好吧 如果您只想转换 XML 字符 您需要执行
  • Django 信号发射一次,接收两次——为什么?

    我正在使用 Django 信号 但即使发出一次 它们似乎也会被接收两次 这是我正在使用的代码 这是一个将 Uploadify 与 Django 结合使用的简单包装器 Signal emitting code emits whenever a
  • RAILS 3 模型验证包含不起作用

    Schema Information Schema version Table name terms id integer not null primary key user id integer term type string 255
  • 是否可以将 Firebase 与 Windows 8 应用结合使用?

    我希望在使用 WinJS 制作的 Windows 8 应用程序中使用 Firebase 以下是我尝试写入 Firebase 根目录的方式 var dataRef new Firebase https
  • Python 中 iter 函数的第二个参数是什么?

    让我们考虑一个文件 echo e This is a foo bar sentence nAnd this is the first txtfile in the corpus gt test txt cat test txt This i
  • jQuery 中如何查找具有特定 id 的 div 是否存在?

    我有一个附加一个函数 div 到单击时的元素 该函数获取单击元素的文本并将其分配给名为的变量name 然后将该变量用作 div id附加元素的 我需要看看是否 div id with name在我追加元素之前已经存在 但我不知道如何找到它
  • STL容器如何复制对象?

    我知道 STL 容器 比如vector添加对象时复制该对象 push back方法如下 void push back const T x 我很惊讶地发现它把该项目作为参考 我编写了一个示例程序来看看它是如何工作的 struct Foo Fo