添加多维向量C ++

时间:2012-03-13 17:43:49

标签: c++

在尝试对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'的调用不是成员函数。现在从我从其他问题中可以看出,因为我没有将正确的对象作为争论传递,但是,我确信我想将迭代器与元素一起的向量中的每个元素加在一起。接下来就排了。

我已经尝试过尽可能清楚,请询问,我会尽可能多地添加细节来帮助您回答。我是新手,我很乐意接受批评;它只会让我成为一个更好的程序员。感谢您的时间。

1 个答案:

答案 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。使用向量和“数学”类型代码,使用数组索引表示法通常更简单