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

时间:2018-06-21 02:04:20

标签: c++ vector constructor std

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

2 个答案:

答案 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, ...),其中InputIteratorstd::string*实例化。

答案 1 :(得分:0)

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

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

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