尝试push_back()结构导致2D向量中的信息不正确

时间:2014-09-25 03:14:42

标签: c++ vector

我有一个2D矢量,我试图填充坐标。我为自己的缘故定义了一个坐标结构,但由于某种原因,push_back()函数没有将正确的y坐标推到矢量上,而是仅推送第一个。

以下是相关代码:其余代码对此代码段并不重要。

struct coor2d {
  float x;
  float y;
};

// Inside a function 
int row = 5;
int col = 5;
float r_wide = 1.0/float(row);
float r_high = 1.0/float(col);

vector<vector<coor2d> > grid;
vector<coor2d> column;
for(int cr = 0; cr < row; cr++) {
  for(int cc = 0; cr < col; cc++) {
    coor2d temp;
    temp.x = (float(cc) * r_wide) + (r_wide/2.0);
    temp.y = ((float(cr) * r_high) + (r_high/2.0) * -1.0);
    // Here the temp.y value is correct
    column.push_back(temp);
    // Here the temp.y value is incorrect
  }
  grid.push_back(column);
}

其余代码依赖于此工作正常。我假设我失去了精确度,或者在这里打错了。我知道我可以为coor2d做一个构造函数,但我不认为这会解决这个问题;但是,我可能是错的。

显示问题的一个例子:

一旦通过for(cr&lt; row)循环的第一次迭代,内部for(cc&lt; col)循环输出正确的x坐标,但是在column.push_back(temp)完成之后,y -coordinate就好像cr仍然是0.0f而不是1.0f,将-0.1f输出到向量而不是正确的-0.3f。这发生在cr的任何值上。

有人能解释一下这个问题吗?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

正如@Erik指出的,你有一个错字。这样:

for(int cc = 0; cr < col; cc++) {

应该是这样的:

for(int cc = 0; cc < col; cc++) {

另外,我想你可能想要&#34;重置&#34;外部for循环的每次传递都是column向量。我认为简单的方法就是移动它:

vector<vector<coor2d> > grid;
for(int cr = 0; cr < row; cr++) {
  vector<coor2d> column;  // move the column vector to here
  for(int cc = 0; cr < col; cc++) {

如果你不这样做,column向量只会累积你推送到它上面的所有值。

随着这些变化,我得到了我认为的理智#34;理智&#34;该测试程序的输出:

#include <iostream>
#include <vector>

struct coor2d {
  float x;
  float y;
};

int main(){
// Inside a function 
  int row = 5;
  int col = 5;
  float r_wide = 1.0/float(row);
  float r_high = 1.0/float(col);

  for(int cr = 0; cr < row; cr++) {
    std::vector<coor2d> column;
    for(int cc = 0; cc < col; cc++) {
      coor2d temp;
      temp.x = (float(cc) * r_wide) + (r_wide/2.0);
      temp.y = ((float(cr) * r_high) + (r_high/2.0) * -1.0);
    // Here the temp.y value is correct
      column.push_back(temp);
    // Here the temp.y value is incorrect
      std::cout << "temp.x: " << temp.x << " temp.y: " << temp.y << std::endl;
      std::cout << "vec.x:  " << column[cc].x << " vec.y:   " << column[cc].y << std::endl;
    }
  grid.push_back(column);
  }
}