我读了一些用c ++编写的代码如下:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int iarr[] = {30, 12, 55, 31, 98, 11, 41, 80, 66, 21};
vector<int> ivector(iarr, iarr + 10);
}
在上面的代码中,我将iarr
和iarr+10
传递给ivector(iarr, iarr + 10)
以创建新的向量,这是构建vector
的正确方法吗?我检查了STL文件,那里没有提到,这是允许的吗?
而且,数组iarr
包含10个元素,我应该使用ivector(iarr, iarr+9)
吗?
答案 0 :(得分:12)
是的,这是允许的,是的,你做得对。
您正在调用此模板化构造函数:
template<class InputIterator>
vector(
InputIterator _First,
InputIterator _Last
);
模板参数InputIterator
为int*
(这是表达式iarr
和iarr + 10
)的类型。
由于文档指出_Last
必须指向范围内最后之外的一个元素,因此+ 10
也可以复制数组中的所有10个元素( iarr + 9
指向最后一个元素,iarr + 10
指向超出最后一个元素的一个元素。)
答案 1 :(得分:5)
数组的简单助手:
template <typename T, size_t N>
size_t size(T(&)[N]) { return N; }
template <typename T, size_t N>
T* begin(T(&array)[N]) { return array; }
template <typename T, size_t N>
T* end(T(&array)[N]) { return array + N; }
现在你可以写:
int main() {
int const arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
std::vector<int> vec(begin(arr), end(arr));
}
不再担心数组的大小,它会自动计算。
答案 2 :(得分:3)
是的,这是std::vector
的构造函数。就是这个:
template <class InputIterator>
vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
它需要两个迭代器(在您的情况下为指针),一个用于初始化,另一个用于初始化向量的元素序列的末尾。最后一个参数是可选的,除非您使用自定义分配器,否则不需要它。
结尾的迭代器应该是您想要包含的最后一个元素的一个。因此,如果您想要从iarr[0]
到iarr[9]
的所有元素,则需要传递iarr + 10
。
答案 3 :(得分:1)
它使用迭代器分配一个向量,并显示原始的iarr []。有十个元素,+ 10是一个适当的迭代,因为它是一个结束的一步。这就是矢量的工作原理 - 它必须指向一个过去的位置。它将数组的内容复制到向量中。更清楚的是,它使用此模板来创建向量:
template <class InputIterator> vector ( InputIterator first,
InputIterator last, const Allocator& = Allocator() );
迭代构造函数:迭代 在第一个和最后一个之间,设置副本 每个元素序列的 容器的内容。
答案 4 :(得分:1)
如果您查看文档here
,则确实允许使用此代码template <class InputIterator>
vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
参数指定的范围遵循通常的约定[first,last [,因此如果要复制整个数组,则传递iarr + 10是正确的
答案 5 :(得分:0)
是的,这是允许的,ivector
将包含10个元素。不,它不应该是9
因为结束迭代器应该超过结束的一步。如果您知道范围是什么,则该范围将由此范围表示:[beginning, end)
。也就是说,包括第一个,然后直到但不包括最后一个。
因为STL(C ++标准库 cough )是所有模板,所以支持运算符++
和*
(取消引用运算符)的任何东西都可以作为迭代器传递给矢量构造函数。这个属性令人惊讶地使相同的代码适用于指针和vector
迭代器。标准库设计处于最佳状态。
答案 6 :(得分:0)
是的,函数main()中的最后一行调用std :: vector的构造函数。看看here
查看所有向量构造函数重载。第三个在这里使用。它的参数是模板类型的迭代器(这里使用的模板参数是int
,因此迭代器的类型为int*
)。第二个参数是迭代器,它指向不会被复制到向量中的第一个序列元素。