This question already has answers here:
What is array to pointer decay?
(9个答案)
2年前关闭。
我在一个项目中遇到了一段C++代码,该代码用两个输入初始化一个 vector 。
输入之一是现有数组,另一个是相同数组加上数组长度。
我在另一个站点上找到了类似的代码:
有人可以解释
引用此代码的网站说,这是所使用的相应构造函数:
(9个答案)
2年前关闭。
我在一个项目中遇到了一段C++代码,该代码用两个输入初始化一个 vector 。
输入之一是现有数组,另一个是相同数组加上数组长度。
我在另一个站点上找到了类似的代码:
// 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]
类型。当传递给函数时,它是decayed指向第一个元素的指针。在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*
实例化。
关于c++ - 具有两个输入参数的std::vector构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50959345/