将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())); 
    } 
} 

请您帮忙解决这个问题吗?谢谢。

+0

错误信息是什么意思? – 2011-06-03 02:31:50

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);)。

+0

尊敬的ildjarn 感谢您发现th错误。 – GoldenLee 2011-06-03 02:49:10

+0

是的。我在测试过程中已经发现了这个问题。 – GoldenLee 2011-06-03 02:54:33