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]在哪里以及为什么我无法在此代码中访问它。
答
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));
'&A [0]' - >'a.begin()'&'&A [5]' - >'a.end()' – George
您没有指派它。 – 2017-10-16 20:04:49
'我 2017-10-16 20:06:17