std::具有两个输入参数的矢量构造函数

std::vector constructor with two input arguments

本文关键字:参数 输入 构造函数 两个 std      更新时间:2023-10-16

我在我的一个项目中遇到了一段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());

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

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

所以在你的例子中arr + sizeof(arr)/sizeof(std::string)是一个指针,指向数组末尾的一个指针(sizeof(arr)/sizeof(std::string)给出数组中元素的数量(。

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