vector的assign和insert操作实现坐标正逆序添加
程序员文章站
2021-12-18 16:31:50
...
想用vector实现一个坐标的偶数行逆序叠加,形如贪吃蛇的网络连续。最主要的应用比如对XY平台的运动,按照此坐标排序进行移动会节省工序与时间。
我们已经生成好了一个坐标序列的vector
具体方法可以参考之前写的另外一篇博客,vector存储坐标
现在我们需要把这个vector类比到坐标系中,做到坐标点的连续,实现如贪吃蛇的效果。
首先需要我们用到vector的三个操作方法。
assign
void assign(const_iterator first,const_iterator last);
首先assign是将一个vector复制到另外一个vector,将区间[first,last)的元素赋值到当前的vector容器中。
比如:
Mypoints2.assign(Mypoints.begin(), Mypoints1.end());
当然我们可以在first和last索引下添加数字实现下标的变化。(实现将原始数组的前6个复制到新数组中)
Mypoints2.assign(Mypoints1.begin() , Mypoints1.begin() + 6 );
insert
vector向量容器中使用insert()方法,可以对vector的任意位置前插入一个新的元素
vector.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
Mypoints2.insert(Mypoints2.end(), Mypoints.begin(), Mypoints.begin()+3);
在Mypoints2数组的尾部添加Mypoints数组的前三个元素。
reverse
实现数组的反转。
Mypoints1.assign(Mypoints.begin(), Mypoints.end());//原始数组
reverse(Mypoints.begin(), Mypoints.end());//对Mypoints进行反转
对这三个方法进行组合,实现对坐标点的连续。
代码如下:
#include <vector>
#include <iostream>
using namespace std;
struct MyPoint //创建点的数据
{
double x;
double y;
};
int main()
{
vector<MyPoint>Mypoints;//创建点的数组
vector<MyPoint>Mypoints1,Mypoints2;
MyPoint mypoint;//实例化的点
int x = 1;
int y = 1;
int x1;
int y1;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
x1 = x + 2 * j;
mypoint.x = x1;
y1 = y + 3 * i;
mypoint.y = y1;
Mypoints.push_back(mypoint);
cout <<"("<<x1<<" "<< y1 <<")"<<" ";
}
cout << endl;
}
//翻转数组
Mypoints1.assign(Mypoints.begin(), Mypoints.end());//原始数组
reverse(Mypoints.begin(), Mypoints.end());
for (int i = 0; i < 3; i++)//进行奇偶行数判断
{
if (i == 0)
{
Mypoints2.assign(Mypoints1.begin() + 3 * i, Mypoints1.begin() + 3 * (i + 1));
}
if (i%2!=0)
{
Mypoints2.insert(Mypoints2.end(), Mypoints.begin() + 3*i, Mypoints.begin() + 3*(i+1));
}
if (i%2==0&&i>0)
{
Mypoints2.insert(Mypoints2.end(), Mypoints1.begin() + 3 * i, Mypoints1.begin() + 3 * (i + 1));
}
}
system("pause");
}
这个方法有些多余复杂,但是暂时还没有试出合适的方法如果有欢迎大神评论留言啊