用数组的一部分来初始化一个向量?

3
int arr[5] = {0,1,2,3,4};
vector<int> vec;

通常我们会进行以下操作:

vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));

如何使用数组 arr 的前三个值初始化向量 vec

还有,如何使用中间三个值初始化它?

我必须立即进行初始化,不能使用多行的 push_back

1个回答

15
你正在调用的构造函数形式是这个**:
template <class Iterator> vector(Iterator start, Iterator end);
所以,你可以传入任何像一对迭代器的东西。具体来说,你可以传入两个指针,只要它们都指向同一个数组,并且第二个不在第一个之前(如果指针相等,则表示空范围)。
在你的示例中,你传递了一个指向数组第一个元素的指针和一个指向(虚构的)数组最后一个元素之后的元素的指针:
vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));

通常情况下,您可以将任何元素的指针作为起始点传递,并将任何元素后面的指针作为结束点传递。

但是我该如何用 arr 的前三个值初始化向量 vec 呢?

传递指向第一个和第三个元素后面一个的指针:

vector<int> vec(arr, arr+3);

还有,如何使用中间三个值进行初始化?

传入一个指向要复制的第一个项的指针和一个指向要粘贴最后一个元素的指针。 在这种情况下,索引为1和4:

vector<int> vec(arr+1, arr+4);


** 好的,实际上比这更复杂一些,但为了本次讨论可以假装简单处理。实际形式为:template <class InputIterator> vector( InputIterator first, InputIterator last, const Allocator& alloc = Allocator() );


小问题:你写了“[...]只要第二个在第一个之后”,我认为这不够精确——实际上,这两个给定的指针可以相等。这将是一个空范围。 - Frerich Raabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接