VECTOR初始化C++

VECTOR初始化C++

问题描述:

我是C++新手。我有这个代码:VECTOR初始化C++

int main() 
{ 
    vector<int> a = { 1,2,3,4,5,6 }; 

    vector<int> b(&a[0], &a[5]); // what's wrong? Is it completely wrong this way? 

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

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

+0

'&A [0]' - >'a.begin()'&'&A [5]' - >'a.end()' – George

+0

您没有指派它。 – 2017-10-16 20:04:49

+1

'我 2017-10-16 20:06:17

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

这类建筑的使用为std::vector的基于迭代器的构造函数(它能够仅仅使用指针,但不建议这样做,因为迭代器封装它们的执行和可能的行为怪癖,并且通常是安全的) 。 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. 

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

更好的是,vector<int> b {a};使用了复制构造函数,所以你不必放弃使用迭代器或指针。

范围在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]

所以使用这种循环

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

结果不确定的行为神奇的数字6。

你可以写例如

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的一些范围作为矢量的初始值那么你可以写例如

#include <iterator> 

//... 

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