VECTOR初始化C ++

时间:2017-10-16 20:02:49

标签: c++ vector initialization

我是C ++的新手。我有这段代码:

position: absolute

我知道正确的方法。 请告诉我b [5]在哪里以及为什么我无法在此代码中访问它。

3 个答案:

答案 0 :(得分:3)

结束迭代器是过去范围内您想要的最后一项。您可以说&a[6],但最好使用容器的内置迭代器,如vector<int> b(a.begin(), a.end());

更好的是,vector<int> b {a};使用了复制构造函数,因此您根本不需要使用迭代器或指针。

答案 1 :(得分:3)

vector<int> b(&a[0], &a[5]);

这种构造使用std::vector的基于Iterator的构造函数(它只能使用指针,虽然不推荐这样做,因为迭代器封装了它们的实现和可能的行为怪癖,并且通常更安全)。 Iterator构造函数接受两个迭代器,即开头和一个接头。您正在传递开头和结尾,这意味着新矢量的构造范围比原始尺寸小一个。

如果您已经提交了这种语法,那么编写它的正确方法就是

vector<int> b(a.begin(), a.end());

如果你打算复制矢量,那么这是不必要的。您应该使用赋值运算符复制它:

vector<int> b = a; //b is now a copy of a, using its own memory

如果要复制向量的子集,请使用实际的迭代器:

vector<int> b(a.begin() + 2, a.begin() + 5);//Copies a[2], a[3], a[4] into a vector of size 3.

答案 2 :(得分:1)

C ++中的范围以

的形式指定
[first, last)

右括号而不是方括号表示可接受的值不包含值last

因此在此声明中

vector<int> b(&a[0], &a[5]);

指针(迭代器)的可接受范围是[&a[0], &a[5] ),它是指针&a[5]指向的值,不会在向量b的初始化中使用。向量只有5个元素等于a[0], a[1], a[2], a[3] and a[4]

所以在这个循环中使用幻数6

for (int i = 0; i < 6; i++) {
    cout << b[i] << endl;
}

导致未定义的行为。

你可以写例如

for ( size_t i = 0; i < b.size(); i++ )
{
    std::cout << b[i] << std::endl;
}     

或只是

for ( auto x : v ) std::cout << x << std::endl;

显然,初始化矢量b就像

一样简单
vector<int> b( a );

但是如果你想指定矢量a的某个范围作为矢量b的初始化器,那么你可以编写例如

#include <iterator>

//...

vector<int> b( a.begin(), std::next( a.begin(), 6 ) );
相关问题