【问题标题】:In place creation of custom type object in std::list在 std::list 中创建自定义类型对象
【发布时间】:2015-03-21 01:28:56
【问题描述】:

假设我有一个结构

struct someStruct
{
    int a;
    customType b;
};

std::listsomeStruct 实例

std::list<someStruct> aList;

将项目存储到该列表的一种方法是创建一个 someStruct,将我想要的值存储到该实例然后存储 列表中的实例是这样的

someStruct obj;
obj.a = 4;
obj.b = customType::value_type;
aList.push_back(obj);

有没有更通用的方法来做到这一点,这样我就不需要创建对象了?

对不起,首先以数组为例!

【问题讨论】:

  • anArray[0].a = 4;一个数组[0].b = 6; // 等等
  • 哦,是的,当然!我正在考虑使用 C++ 默认情况下不知道如何构造的自定义数据类型的结构,但我刚刚意识到,只要我提供构造函数,C++ 就会知道如何处理它。我应该删除问题吗?
  • 值得注意的是,当您在 C++ 中创建数组时,将为每个元素调用默认构造函数。所以你不能创建一个没有默认构造函数的类型的数组。
  • @zenith 是的,你可以。

标签: c++ stl std


【解决方案1】:

在 C++11 中你可以这样做

anArray[0] = {123, 456};

或更详细地说:

anArray[0] = someStruct{123, 456};

并且在任何版本的 C++ 中,您都可以执行聚合数组初始化:

someStruct anArray[10] = {{1, 2}, {3, 4}, /*...*/};

【讨论】:

    【解决方案2】:

    已编辑,因为原始问题已更改:

    由于这现在是明确的 C++,单行方法是为结构提供构造函数。

    struct someStruct {
      someStruct(int new_a, customType new_b) : a(new_a), b(new_b) {}
      int a;
      customType b;
    };
    
    ...
    
    aList.push_back(someStruct(4, customType::value_type));
    

    这与push_back() a struct into a vector密切相关

    【讨论】:

      【解决方案3】:

      在 C 中,您可以使用 designated initializer 语法:

      struct someStruct ss[] = {
          {.a=5, .b=6}
      ,   {.a=6, .b=7}
      ,   {.a=7, .b=8}
      };
      

      Demo.

      此语法在 C++ 中不可用,因此您必须坚持基于位置的旧式初始化:

      struct someStruct ss[] = {
          {5, 6}
      ,   {6, 7}
      ,   {7, 8}
      };
      

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2013-06-18
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        • 2021-02-14
        • 2016-12-15
        相关资源
        最近更新 更多