将1D向量转换为2D向量

时间:2011-06-03 02:23:06

标签: c++ vector copy

使用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()));
    }
}
你能帮忙解决这个问题吗?谢谢。

1 个答案:

答案 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<>::iteratorvector<>覆盖足够数量的元素时表现为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);,如果您真的对效率感到迂腐)。