当前位置: 首页 > 知识库问答 >
问题:

除了用值填充某些容器外,std::initializer\u list构造函数用于什么?

孔瑾瑜
2023-03-14

在标准库中可以找到一个主要而明显的含义-“使用其元素列表初始化html" target="_blank">集合”:

std::vector<int> v = {1, 2, 3};

在下面std::bitset上的链接后面可以找到另一个含义——“单个值是由initializer\u list的元素组合而成的”。

标准库中的第三个示例是std::piecewise\u constant\u distribution,但我不知道它有什么语义,而不是元素的集合。

std::initializer\u list构造函数的其他用例是什么?如果可能,请提供真实代码的示例。

这实际上是一个关于课堂设计的问题
由于列表初始化的某些特殊性,向现有类添加std::initializer\u列表构造函数很容易成为一个令人惊讶的突破性更改,因此在编写新类时,您应该始终提前知道它是否需要std::initializer\u列表构造函数<因此,我试图通过编写std::initializer\u list构造函数的用例来模拟预见未来的能力。

主要问题是:我如何确定我的类将来可能会有(对用户来说并不奇怪)std::initializer_list构造函数来编写正确的非std::initializer_list构造函数?

共有2个答案

尹弘壮
2023-03-14

我认为intializer_list有以下主要特点:

  1. 它将初始化概念封装在一个类中
  2. 此机制还提供类型安全性,并避免可能导致信息丢失的任何转换
  3. Its提供了唯一的const\u迭代器类型接口,因此可以对其进行读优化,并且任何主体都不能更新/写入它。这很有意义,因为它是用来初始化另一个对象的

例如,您可能希望参考我的博客和ISOCPP信息。

编辑

std::initializer_list的可能优势

//1. Initialization Concept In A class
std::initializer_list<int>  x{1,2,3,4,5};
std::vector<int> v(x.begin(), x.end());




//2.Better Type Safety and avoid narrow conversions scenario
 std::vector<int> v{1, 2, 3.4, 4};

 Compiler Output

 narrowing conversion of ‘3.3999999999999999e+0’ from ‘double’ to ‘int’ inside { }



//3. Provide Const iterator type interface
std::initializer_list<int> ly{1,2,3,4,5};
auto itrs = ly.begin();
int* x = itrs;

Compiler Output

error: invalid conversion from ‘const int*’ to ‘int*’ 
庞安晏
2023-03-14

实际上,我正在我当前的项目中使用这种技术。我有一个类“BaseMenu”,它需要在它的构造函数中初始化std::vector,所以它的参数是std::vector。然后,我有一个从BaseMenu继承的主菜单,我只是告诉BaseMenu我想要的主菜单是什么样子:

BaseMenu(std::vector<std::string>);

MainMenu::MainMenu():
    BaseMenu({{"Play"},
              {"Options"},
              {"About"},
              {"Quit"}})

真的很“舒服”。PS:上面的模型被简化了,但它应该给人一种std::initializer\u list有用的感觉

 类似资料:
  • 主要内容:类继承和初始化,初始化器继承和覆盖在Swift 4中声明的类,结构体和枚举初始化以准备类的实例。 存储属性初始化初始值,对于新实例也初始化值,初始化值以准备初始实例数据。 创建初始化由方法执行。 Swift 4初始化程序与Objective-C的不同之处在于它不返回任何值。 它是在处理之前检查新创建实例的初始化。 Swift 4还提供了“取消初始化”过程,用于在取消分配实例后执行内存管理操作。 存储属性的初始化程序角色 存储属性必

  • 我想这样使用std::ostream: 有一个错误,说ostream构造函数受到保护: 错误:'std::basic_ostream 但我记得

  • 是缺乏 一个疏忽?它对我来说似乎非常有用,动态容器(如)确实有一个类似的构造函数。 我完全意识到 但这不是构造函数,内存将首先清零。如果我想让所有人都像这家伙一样呢?

  • 问题内容: 我如何使用该字段注入包含Map的属性文件,以用作其他构造函数arg。 从属性文件加载地图 该bean当前使用以下命令进行设置: 相当于Java: 谢谢 问题答案: 像这样: 这利用了使用任意静态工厂方法创建bean的能力,在这种情况下,使用工厂工厂方法来创建bean,然后将其注入到的适当构造函数中。

  • 问题内容: 我在作业上碰壁,一直在梳理网站以寻求任何有用的信息(出现空白)。我需要创建一个类,在该类中创建一个构造函数,然后再创建一个子类以扩展超类。然后,我需要使用main方法创建一个新文件来演示这两种情况。从概念上来说没问题。 我的问题是:如何使用构造函数初始化对象,但需要用户输入? 现在我得到的错误是:“类CarRental中的构造函数CarRental无法应用于给定类型;必需:String

  • 问题内容: 我正在编写Python代码以生成和绘制“超高斯”函数,如下所示: 下面的代码只是作图。由于某种原因,我无法理解,当将默认值8用于或最多13时,此代码可以正常工作。当值为14或更高时,该函数崩溃并显示错误消息: 在函数定义的返回行。有任何想法吗?由于该行中唯一使用.exp的东西是错误消息,似乎暗示它被解释为浮点数,但仅适用于…的较大值。 我正在用numpy 1.7.1和scipy 0.1