我在一个项目中遇到了一段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());
答案 0 :(得分:3)
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*
实例化。
答案 1 :(得分:0)
在这里,您可能需要了解的最重要的事情是std::string[]
可以隐式转换为std::string*
(指向数组中第一个元素的指针)。
因此,您示例中的arr + sizeof(arr)/sizeof(std::string)
是指向数组末尾的指针(sizeof(arr)/sizeof(std::string)
给出了数组中元素的数量)。
因此,传递给vector
的构造函数的两个元素是指针,它们可以充当迭代器,并使用vector
中的四个元素来初始化arr
。