如何从其他向量初始化向量

时间:2017-11-06 09:08:42

标签: c++

我对C ++中的std :: vector有疑问。 如何将第一个向量中的少数元素放入第二个向量中。 在向量构造函数中? 这是我的代码,它不起作用:

std::vector<int> a;
int i;
for (i=0;i<10;i++) a.at(i)=10;
std::vector<int> b(&a.at(4), &a.at(7));

我期望向量b是来自向量a [4] - a [7]的元素 你能帮我吗

2 个答案:

答案 0 :(得分:5)

std::vector<T>有一个constructor *,它接受一对迭代器。您可以像这样使用它:

std::vector<int> b(a.cbegin() + 4, a.cbegin() + 7);

*请参阅链接页面上的第4个构造函数签名。

请注意,这不包括a[7],因为正如@taskinoor所指出的那样,第二个迭代器是复制范围结束之后的一个迭代器。如果您还打算包含a[7],则应将第二个参数更改为a.cbegin() + 8

答案 1 :(得分:2)

std::vector<int> a;
int i;
for (i=0;i<10;i++) a.at(i)=10;

此代码将抛出std::out_of_range异常,因为a.size()为零。

std::vector<int> b(&a.at(4), &a.at(7));

这不包括a[7],因为两个迭代器/位置的构造函数是开放式的,即[first, last)。因此,不会包含last a[7]。如果要包含a[7],则必须将a[8]指定为结束时间间隔。

std::vector<int> b(&a.at(4), &a.at(8));

或者

std::vector<int> b(&a[4], &a[8]);

但如果8超出范围,这将无效。所以如果使用atoperator[],你应该使用像@TerraPass这样的迭代器:

std::vector<int> b(a.cbegin() + 4, a.cbegin() + 8);