使用std :: copy将1D矢量转换为2D矢量时出现编译错误。
int main()
{
std::vector< std::vector<float> > v2D(10, std::vector<float>(10, 0.0));
std::vector<float> v1D(100, 0.0);
for (int i = 0; i < 100; ++i)
v1D.push_back(i);
for (unsigned int j = 0; j < 10; j++)
{
std::copy(v1D.begin() + j * 10, v1D.begin() + (j + 1) * 10, std::back_inserter(v2D[j].begin()));
}
}
你能帮忙解决这个问题吗?谢谢。
答案 0 :(得分:4)
std::back_inserter
接受一个容器,而不是迭代器。将std::back_inserter(v2D[j].begin())
更改为std::back_inserter(v2D[j])
。请注意,这将在.push_back()
std::vector<float>
上调用v2D[j]
,因此您可能还希望将std::vector< std::vector<float> > v2D(10, std::vector<float>(10, 0.0));
更改为std::vector< std::vector<float> > v2D(10);
。
或者,您可以将std::back_inserter(v2D[j].begin())
更改为v2D[j].begin()
。这是有效的,因为std::copy
需要输出迭代器,std::vector<>::iterator
在vector<>
覆盖足够数量的元素时表现为1。这样,您当前初始化v2D
已经很理想了。
编辑:其他人在单独的答案中说这是删除它,所以我代表他们说,因为它肯定值得注意:因为你用100个元素初始化v1D
,然后将{1..100]数字push_back
追加到最初的100个元素(它们都具有指定值0)而不是覆盖它们。您应该将std::vector<float> v1D(100, 0.0);
更改为std::vector<float> v1D;
以获得您显然想要的行为(或std::vector<float> v1D; v1D.reserve(100);
,如果您真的对效率感到迂腐)。