具有两个输入参数的 std::vector 构造函数[重复]

Posted

技术标签:

【中文标题】具有两个输入参数的 std::vector 构造函数[重复]【英文标题】:std::vector constructor with two input arguments [duplicate] 【发布时间】:2018-06-21 02:04:19 【问题描述】:

我在我的一个项目中遇到了一段 C++ 代码,它用两个输入初始化一个向量。

其中一个输入是现有数组,另一个是同一个数组加上数组长度。

我在另一个网站上发现了一段类似的代码:

// Create an array of string objects
std::string arr[] = "first", "sec", "third", "fourth";

// Initialize vector with a string array
std::vector<std::string> vecOfStr(arr, arr + sizeof(arr)/sizeof(std::string));

for(std::string str : vecOfStr)
    std::cout << str << std::endl;

谁能解释一下arr + sizeof(arr)/sizeof(std::string)是什么?

引用此代码的网站说这是使用的相应构造函数:

vector (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type());

【问题讨论】:

我在另一个网站上发现了一段类似的代码: -- 完成该代码后,将该行更改为std::array&lt;std::string, 4&gt; arr = "first", "sec", "third", "fourth";,这样元素只是arr.size(),而不是经常被滥用的“sizeof”技巧(如果arr作为指针传递给函数,那将不起作用)。 【参考方案1】:

arr 本身是std::string[4] 类型。当传递给函数时,它是decayed 指向第一个元素的指针。在表达式arr + sizeof(arr)/sizeof(std::string) 中,第一次出现的arr 再次衰减。第二个不是。 sizeof(arr)/sizeof(std::string) 因此评估为 4,这是数组范围。整个表达式arr + sizeof(arr)/sizeof(std::string) 然后计算为指向arr 中最后一个元素之后位置的指针。这通常被称为 off-the-end 迭代器。这有效地调用了构造函数vector(InputIterator first, InputIterator last, ...),其中InputIteratorstd::string* 实例化。

【讨论】:

【参考方案2】:

您需要了解发生的最重要的事情可能是std::string[] 可以隐式转换为std::string*(指向数组中第一个元素的指针)。

因此,您的示例中的arr + sizeof(arr)/sizeof(std::string) 是指向数组末尾之后的一个指针(sizeof(arr)/sizeof(std::string) 给出数组中元素的数量)。

所以传递给vector的构造函数的两个元素是指针,它可以充当迭代器,并用来自arr的四个元素初始化vector

【讨论】:

以上是关于具有两个输入参数的 std::vector 构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

具有成员 std::vector 的移动语义

MSVC 2015 为 std::vector 选择不正确的构造函数重载

为啥 C++11 会从 std::vector 填充构造函数的原型中移除默认值?

std::vector emplace_back 可以从向量本身的元素复制构造吗?

带数组参数的构造函数

使用 std::vector 作为标头中的输入参数定义函数的原型