什么是 std::vector<std::string> vec{3};其实呢?

问题描述

我目前正在尝试理解 C++11 中的列表初始化,我偶然发现了这行代码std::vector<std::string> vec{3}; 我想知道它实际上在做什么,我注意到在向量中创建了 3 个元素,我不确定这些元素将被初始化的原因和值。

编辑: 我试过跑步:

int main()
{
  std::vector<std::string> vec{3};
  std::cout<<vec.size()<<std::endl;
  std::cout<<vec[0]<<std::endl;
  std::cout<<vec[1]<<std::endl;
  std::cout<<vec[2]<<std::endl;
}

而我只得到输出
3

如果它们是认初始化的,输出不应该是:
3
0
0
0

解决方法

vector<T> 有一个构造函数,它接受一个整数;它创建了一个包含 3 个默认初始化的 T 的向量。因此,当您使用等效于 vector<T>{3} 的语法时,此构造函数是可行的候选构造函数。

但是,使用 {} 语法意味着首先检查任何采用 vector<T>initalizer_list 构造函数。如果 T 中的 vector<T> 是整数类型,{3} 将映射到 vector<T>initializer_list<T> 构造函数。

但是由于在这种情况下 T 是一个 std::stringvector<std::string>initializer_list 构造函数不匹配整数。因此,而是调用了 N 元素构造函数。

为避免将来发生此类情况,您应避免将 {} 与容器和类容器类型一起使用,除非您打算使用一系列元素对其进行初始化。

如果它们是默认初始化的,输出不应该是:

没有。默认初始化的 std::string 不包含任何字符。不是“0”字符,没有字符。如果你打印出一个不包含任何字符的字符串,那么你什么也没有打印出来。

,

当您在 C++ 中初始化字符串向量时,它们将默认为空字符串,或 ""。如果您尝试打印

std::cout << "";

你什么也得不到。这基本上就是这里发生的事情。每个索引只是一个打印空字符串的空字符串。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...