(用于)在C++中旋转和切割容器的元素

Tom*_*Tom 2 c++ rotation spline splice

我有一个std::vector保持一个Point struct(X,Y,Z和其他一些非指针类型).

这些点是绘制bspline曲线的控制点.我在绘制曲线时没有遇到任何问题,但是当我必须关闭曲线时会出现复杂情况,其中包括以特定顺序添加控制点(在容器内存在的alredy).

例如,如果我有5个控制点

A B C D E
Run Code Online (Sandbox Code Playgroud)

我必须得到5个像这样的序列:

A B C D  //curve is drawn from B to C
B C D E  //curve is drawn from C to D
C D E A  //curve is drawn from D to E 
D E A B  //curve is drawn from E to A
E A B C  //curve is drawn from A to B
Run Code Online (Sandbox Code Playgroud)

最初,我去了std::rotate,但后来意识到这不是我想要的.

我在实现这个方面遇到了麻烦.我得到的最好的是C++中的非工作版本(这种失败的原因不是问题,这里是一个片段).

static char letters = 'A';
typedef struct Point{
        float x,y,z;
        char name;

        Point(float x,float y,float z=0):name(letters++){}

}Point;
typedef std::vector<Point> lpoints;

void
rotate(lpoints& points)
{
    for (unsigned int i =0;i<5;i++){
                lpoints::iterator beg =   lista.begin() + (i%5);
                lpoints::iterator dernier=lista.begin()+(4+i)%6; 

                lpoints subseq(beg,dernier); //4 points in subseq

                //do stuff with subseq                                                       
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我知道我可以使用许多嵌套for循环实现它,但我试图避免这种情况,寻找更优雅的东西(如果这个词适合).

提前致谢.

小智 5

如果您愿意使用更多空间,则可以先将lpoints附加到自身,然后在需要时使用subseq增加迭代器.这也适合你的'5个不同的向量或一个长的向量',因为你可以使用双向量的迭代器,而不是创建新的向量.

请原谅,我还没有写过一段时间的C++,所以这里的C++就像伪代码一样

void 
rotate(lpoints& points) 
{ 
    pointsDouble = Append(points,points); // Do your own implementation
                                 // if points is A B C D E
                                 // pointsDouble is A B C D E A B C D E

    pointsDouble::iterator beg =   lista.begin(); 
    pointsDouble::iterator dernier=lista.begin()+4;  

    for (unsigned int i =0;i<5;i++){ 

        lpoints subseq(beg,dernier); //4 points in subseq 

        //do stuff with subseq

       ++beg; ++dernier;

    } 
}
Run Code Online (Sandbox Code Playgroud)

for循环也许可以更好地编写,在开始和结束(或dernier)而不是循环变量i.

对于追加,你可以使用std :: copy(警告:我在C++中生锈).

lpoints pointsDouble(points);
std::copy(points.begin(), points.end(), std::back_inserter(pointsDouble));
Run Code Online (Sandbox Code Playgroud)

(Luc建议的back_inserter)