在尝试对3d Vector中的元素求和时有点头痛。
它是我正在编程的k-means算法;我理解并可以在纸上做的算法,但语法上让我有点舌头。我可能会提到这个项目是我第一次真正处理C ++中的复杂容器。目前我想计算群集中我的点的新质心,这是通过平均群集中每个坐标的位置来完成的。我的3d矢量被设置为一个簇的向量,每个簇包含一个向量,其中包含我的坐标在该簇中的向量(我希望听起来很清楚,希望我的代码可以减轻任何混淆)。我正在尝试使用迭代器,但我正在考虑回到int和index,因为我对它们感觉更舒服,尽管我觉得我应该学习这种语法是如何工作的,因为它看起来很重要而且功能强大。
我将发布我所坚持的功能以及与之相关的标题部分。如果您希望看到任何其他代码,我很乐意根据要求提出这些代码,但我觉得这应该足以证明我的问题。
.h file parts (public members of class):
vector< vector < vector <float> > > clusters;
vector<vector<float> > avg;
int avgDiv;
.cpp file part with comments to help elaborate my query:
vector<vector<vector<float> > >::iterator threeD;
vector<vector<float> >::iterator row;
vector<float>::iterator col;
for (threeD = clusters.begin(); threeD != clusters.end(); threeD++) {
for (row = threeD->begin(); row != threeD->end(); row++) {
for(col = row->begin(); col != row->end(); col++){
//its this code below that is causing my headache,
//I know that what is written isn't correct,
//it is there to serve as an example of what I've
//been trying to do to sort out my issue.
avg.at(row) ( = or push_back ) ((clusters.at(row).at(col)) + (clusters.at(row+1).at(col)));
}
avgDiv = distance(row->begin(),row->end());
//divide each value in avg vector by the amount of members in row, giving the new centroid for that cluster, loop forward to next cluster. this isn't a problem I should think.
}
}
我的问题是编译器告诉我对'at'的调用不是成员函数。现在从我从其他问题中可以看出,因为我没有将正确的对象作为争论传递,但是,我确信我想将迭代器与元素一起的向量中的每个元素加在一起。接下来就排了。
我已经尝试过尽可能清楚,请询问,我会尽可能多地添加细节来帮助您回答。我是新手,我很乐意接受批评;它只会让我成为一个更好的程序员。感谢您的时间。
答案 0 :(得分:3)
avg.at(index)
与整数索引一起使用,它只是带有边界检查的'c'数组[index]表示法 - 偶然在实际代码中你要使用[]或禁用检查速度。
但是row
是一个迭代器,实际上它是一个指向avg中元素的指针,所以只需取消引用它来获取值。
*row = value of avg at position of iterator 'row'
关于C ++迭代器的一个很好的教程http://www.cprogramming.com/tutorial/stl/iterators.html
PS。使用向量和“数学”类型代码,使用数组索引表示法通常更简单