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