用向量编写算法的问题

时间:2011-10-19 16:13:08

标签: c++ algorithm vector

-(void)userShow{
    vector<CGPoint>::iterator it;
    vector<CGPoint>* xp = x.graphPoints;
    vector<CGPoint>* yp = y.graphPoints;
    xVal = new vector<double>();
    yVal = new vector<double>();
    xyVal = new vector<double>();
    xxVal = new vector<double>();
    value = new vector<double>();
    c = new vector<double>();   


    for(it = xp->begin(); it != xp->end(); ++it){
        xVal->push_back(it->y);
        xxVal->push_back(it->x);

    }
    for(it = yp->begin(); it != yp->end(); ++it){
        xyVal->push_back(it->x);
    }

    for (int i = 0; i < xVal->size(); i++){
        c = xVal[i];
        while (xyVal[c] < xxVal[i];){
            c++;
            if ((c-1)<=xxVal[i]<=c){
                double value = xp[c-1] + (xp[c] - yp[c-1])*(xxVal[i] - xyVal[c-1])/(xyVal[c] - xyVal[c-1]);
            }
            yVal->push_back(value);
        }
    }

   UserGraph->removeAllData();
   UserGraph->addDataSet(xVal, yVal, [UIColor redColor], 0, false, true, 2);
   UserGraph->updateAll();
}

上面是我想要发生的伪代码。我仍然有理解向量的问题。正如您在上面看到的,使用yVal =“...”时,使用vector<CGPoint>vector<double>的二进制表达式存在问题。

这个算法应该做的是在两个图x(t)y(t)上画一条线,然后抓住x(t)的{​​{1}}坐标并将它变成一个新的载体。在第二段时间之后,将y的{​​{1}}坐标与x(t) x坐标进行比较以获取y(t)坐标。当x的x和y x(t)不匹配时,需要执行y(t) =算法。

有人可以帮我把我的伪代码变成工作代码吗?干杯

2 个答案:

答案 0 :(得分:2)

你的代码中有一些谜团,但这样的事情有希望让你开始。我删除了使用指针 - vector并将一些注释排成一行来解释我的更改。

void userShow() {

    // I assume that x.graphPoints is just some `std::vector<CGPoint>` and you just want to use it locally

    // if x.graphPoints returns an "std::vector<CGPoint> *" (pointer-to-vector), 
    // you should probably modify the class/struct/whatever to just use the vector,
    // not a pointer-to-vector
    vector<CGPoint>& xp = x.graphPoints;

    // ditto for y.graphPoints
    vector<CGPoint>& yp = y.graphPoints;

    // You almost never use pointers to containers, nor allocate them with new - 
    // it's an atypical practice in C++
    /* 
    xVal = new vector<double>();
    yVal = new vector<double>();
    xyVal = new vector<double>();
    */

    // instead just create the vectors on the stack
    std::vector<double> xVal, yVal, xyVal;

    std::vector<CGPoint>::iterator it;

    // These have been changed to not use -> member notation, since we're not
    // using pointers anymore
    for(it = xp.begin(); it != xp.end(); ++it){
        xVal.push_back(it->y);
        xxVal.push_back(it->x); // I have no idea what xxVal is? I think it's xyVal?
        // xyVal.push_back(it->x); // like this?
    }

    // you can iterate through a vector with this type of loop, or
    // use an iterator as above
    for (int i = 0; i < xp.size(); ++i){
        int c = 1;
        while (xyVal[c] < xxVal[i]) {
            ++c;

            // (c-1)<=xxVal[i]<=c; // ??? 

            // I think the previous line means...c gets the value of xyVal[i], and
            // xxVal gets c-1? You'll have to explain this, otherwise it it just a
            // free-standing conditional comparison

            // EDIT: I think I understand what you mean
            // this was a conditional check to do the yVal stuff
            /**
            if ( (c-1) <= xxVal[i] && xxVal[i] <= c) {
                // yVal = xp[c-1] + (xp[c] - yp[c-1])*(xxVal[i]-xyVal[c-1])/(xyVal[c] - xyVal[c-1]);
            } */

            // as mentioned, yVal is a vector, so what do you want?
            yVal = xp[c-1] + (xp[c] - yp[c-1])*(xxVal[i]-xyVal[c-1])/(xyVal[c] - xyVal[c-1]);

        }
    }
}

答案 1 :(得分:1)

yVal = xp[c-1] + ....

yVal指向双打矢量(你几乎肯定不会使用btw)而不是值