具有两个输入参数的 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<std::string, 4> 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, ...)
,其中InputIterator
用std::string*
实例化。
【讨论】:
【参考方案2】:您需要了解发生的最重要的事情可能是std::string[]
可以隐式转换为std::string*
(指向数组中第一个元素的指针)。
因此,您的示例中的arr + sizeof(arr)/sizeof(std::string)
是指向数组末尾之后的一个指针(sizeof(arr)/sizeof(std::string)
给出数组中元素的数量)。
所以传递给vector
的构造函数的两个元素是指针,它可以充当迭代器,并用来自arr
的四个元素初始化vector
。
【讨论】:
以上是关于具有两个输入参数的 std::vector 构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章
MSVC 2015 为 std::vector 选择不正确的构造函数重载
为啥 C++11 会从 std::vector 填充构造函数的原型中移除默认值?