【问题标题】:Constructing Vectors in C++在 C++ 中构造向量
【发布时间】:2013-10-11 20:56:45
【问题描述】:

我最近遇到了这段代码,但不太明白发生了什么。

auto c = vector<int> {};

向量构造函数返回什么?

然后这段代码:

c = vector<int> {1,2,3,4,5 };

第二个c 与初始c 是否位于不同的内存位置?

c 重新初始化时是否调用了析构函数?

我搜索了互联网,但找不到上述代码的任何示例。

上面和上面有什么不同

vector<int> c {};

提前感谢您的帮助。

【问题讨论】:

  • 简答:那是 C++11
  • 请使用正确的格式,否则尖括号中的文字将无法正确显示
  • 至于auto c = vector&lt;int&gt; {};vector&lt;int&gt; c{};的区别,参见Herb Sutter的Almost Always Auto风格。
  • 你以前遇到过 {} 和初始化列表吗?

标签: c++ c++11 vector


【解决方案1】:

“正如 jrd1 所说,它是 C++11 的一个特性。

关键字auto基本上意味着你让编译器“猜测”变量的类型。

所以c 是一个普通的vector&lt;int&gt;

【讨论】:

  • "Guess" 有点苛刻——如果不能完全推断出类型,它就不会编译:)
  • 没错,我也会加上双引号。 :)
  • 我认为这是误解的核心,其余的将随之而来。但可以肯定的是,其他答案更完整,提出问题的人接受了其中一个。
【解决方案2】:

向量构造函数返回什么?

一个空的vector&lt;int&gt;;并且编译器从该构造函数调用中推断出变量c 的类型,这意味着c 将获得vector&lt;int&gt; 的类型。 auto 基本上只是让您免于输入两次变量类型 - 它已经在构造函数调用中给出,您现在不必再次在变量名前面输入它,您可以使用 auto 代替.

第二个 c 是否与初始 c 位于不同的内存位置?

不,是同一个向量;但是来自另一个临时 vector&lt;int&gt; 的值(包含值 1、2、3、4 和 5)通过 operator= 分配给 c。 这意味着c 本身的地址(&amp;c)不会改变。但是,它包含的数据(例如c.data() 的结果)可以并且可能会改变。

在重新初始化 c 时是否调用了析构函数?

不是c 的析构函数。只有一个临时的。

【讨论】:

  • 澄清内存位置位:&amp;c 不会改变,但c.data() 可能会。
【解决方案3】:

“第一个 c”是定义变量 c(int 向量)的位置。

auto c = vector<int> {};

“第二个 c”只是重新分配 c 的值。它不是一个新变量,所以c的内存地址不会改变,也不会调用c的析构函数。

c = vector<int> {1,2,3,4,5 };

实际发生的情况是向量 {1,2,3,4,5 } 创建了一个向量类型的临时对象,该对象从初始化列表中初始化,值为 1,2,3,4,5。然后将此临时对象传递给 c 的复制构造函数(或在 C++11 中)的移动构造函数,以便 c 将其当前值(如果有)替换为临时对象中的值。

c 的析构函数在超出范围之前不会被调用(例如,函数退出或定义它的控制块 {} 退出)。

【讨论】:

    【解决方案4】:

    第一行和最后一行在功能上是等效的。

    作业:

    c = vector<int> {1,2,3,4,5 };
    

    c 不会被破坏,也不会被定位在新的内存操作中。 发生的情况是,将使用 5 个值创建一个未命名的第二个向量,并且 vector::operator= 将用于将该向量的内容分配给 c。这将在 C++11 中的移动操作中发生。之后临时向量将被销毁并调用它的析构函数,而不是 c 的析构函数。

    【讨论】:

      【解决方案5】:

      C++11 包含 auto 关键字,它为您执行类型推断
      它有助于大大简化代码。
      示例:

      auto itr = vec.iterator(); // instead of vector<int>::iterator itr
      

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多