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

Convert 1D vector to 2D vector

本文关键字:2D 矢量 转换 1D      更新时间:2023-10-16

我在使用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()));
    }
}

请你帮忙解决这个问题好吗?非常感谢。

std::back_inserter采用容器,而不是迭代器。将std::back_inserter(v2D[j].begin())更改为std::back_inserter(v2D[j])。请注意,这将在v2D[j]std::vector<float>上调用.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需要一个输出迭代器,而当vector<>中有足够数量的元素要重写时,std::vector<>::iterator的行为就像一个迭代器。这样,您当前对v2D的初始化就已经很理想了。


编辑:其他人在另一个答案中说了这句话,然后删除了它,所以我代表他们说,因为这绝对值得注意:因为你用100个元素初始化了v1D,所以push_back的[1..100]位被附加到最初的100个元素(它们都有你指定的值0)上,而不是覆盖它们。您应该将std::vector<float> v1D(100, 0.0);更改为std::vector<float> v1D;,以获得您明显想要的行为(或者std::vector<float> v1D; v1D.reserve(100);,如果您真的对效率很迂腐的话)。