C++ C++;元素访问失败?

C++ C++;元素访问失败?,c++,vector,C++,Vector,这是一个超级简单的问题,但我似乎看不出哪里出了问题。这段代码的作用是计算pixID向量中的元素数,并将该和返回到平方矩阵PtP中的对角线元素。然而,即使第一个循环中的“i”为元素读取:0,5,10,15,输出结果如下: 1,0,0,0, 0,0,3,0, 0,0,0,0, 0,3,0,0, 而不是期望的: 1,0,0,0, 0,3,0,0, 0,0,2,0, 0,0,0,2, 知道这是怎么回事吗 double where(std::vector<double> &ve

这是一个超级简单的问题,但我似乎看不出哪里出了问题。这段代码的作用是计算pixID向量中的元素数,并将该和返回到平方矩阵PtP中的对角线元素。然而,即使第一个循环中的“i”为元素读取:0,5,10,15,输出结果如下:

1,0,0,0,
0,0,3,0,
0,0,0,0,
0,3,0,0,
而不是期望的:

1,0,0,0,
0,3,0,0,
0,0,2,0,
0,0,0,2,
知道这是怎么回事吗

  double where(std::vector<double> &vec,unsigned int &v){

     double count = 0;
     int val;
     for(std::vector<double>::iterator it = vec.begin();
         it != vec.end();
         ++it){
       if(*it == val){
         count++;
       }
     }

  return count;
  }


  int main(){

  unsigned int pixSide = 2;
  int id;
  std::vector<double> pixID {1,1,2,3,0,2,1,3};
  std::vector<double> PtP (pixSide*pixSide);

  for(unsigned int i=0;i<pixSide*pixSide;i++){
    id = i*pixSide*pixSide + i;
    std::cout << id << std::endl;
    PtP[id] = where(pixID,i);
  }

  for(int i=0;i<pixSide*pixSide;i++){
    for(int j=0;j<pixSide*pixSide;j++){
      std::cout << int(PtP[i*pixSide + j]) << ',';
      if(j==pixSide*pixSide-1){
    std::cout << std::endl;
      }
    }
  }
}
double-where(标准::向量&vec,无符号整数&v){
重复计数=0;
int-val;
for(std::vector::iterator it=vec.begin();
it!=vec.end();
++(it){
如果(*it==val){
计数++;
}
}
返回计数;
}
int main(){
无符号int-pixSide=2;
int-id;
std::向量pixID{1,1,2,3,0,2,1,3};
std::向量PtP(pixSide*pixSide);

对于(unsigned int i=0;i首先,您没有在where()中使用参数“v”。而是使用未初始化的局部变量“val”

第二,我认为你可能在一些点上混淆了你的物体的尺寸,我认为你正在混淆你是只保留对角线还是整个矩阵

这样,您将始终保持整个矩阵:

std::vector<double> PtP (pixSide*pixSide);
std::vector PtP(pixSide*pixSide);
应该是

std::vector<double> PtP (pixSide*pixSide*pixSide*pixSide);
std::cout << int(PtP[i*pixSide*pixSide + j]) << ',';
std::vector PtP(pixSide*pixSide*pixSide*pixSide);


std::cout您是如何使用
std::vector pixID{1,1,2,3,0,2,1,3}编译此代码的;
?这是一个编译时间error@Nima最有可能的情况是,对于支持c++11的编译器,您是否尝试过使用调试器单步执行代码?或者在每一步输出值并与您在该步骤中期望的值进行比较如何?简而言之:您是否尝试过调试代码?@Nima Plasmah是对的,我使用了-std=c++0x进行编译。Plasmah我确实做了一点调试,但在某些方面答案看起来是正确的。无论如何,这是我找错了地方的一个例子。啊,谢谢!这会教我如何对向量使用笨拙的大小定义。至于val,这是出于绝望而在最后一分钟进行的更改,哈哈。我真的建议慢慢来,然后添加我可以合理地命名中间变量。特别是某些变量的值应该是pixSide*pixSide,即实际矩阵的边长。
std::cout << int(PtP[i*pixSide*pixSide + j]) << ',';