将1D矢量转换为2D矢量
使用std :: copy将1D矢量转换为2D矢量时,出现了编译错误。将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()));
}
}
请您帮忙解决这个问题吗?谢谢。
std::back_inserter
需要一个容器,而不是迭代器。将std::back_inserter(v2D[j].begin())
更改为std::back_inserter(v2D[j])
。请注意,这将在std::vector<float>
的v2D[j]
处拨打.push_back()
,因此您可能还需要将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<>
中有足够数量的元素要覆盖时的行为。这样,你目前初始化的v2D
已经是理想的了。
编辑:别人说,这在一个单独的答案然后将其删除,所以我会说这代表他们的,因为这绝对是值得关注的:因为你初始化v1D
有100个元素,在[1 .. 100]数字然后push_back
是附加到最初的100个元素(它们都具有您指定的值0),而不是覆盖它们。您应该将std::vector<float> v1D(100, 0.0);
更改为std::vector<float> v1D;
以获得您显然想要的行为(或者如果您真的关于效率迂腐,则为std::vector<float> v1D; v1D.reserve(100);
)。
错误信息是什么意思? – 2011-06-03 02:31:50