读书人

请教怎样把一个已赋值的vector中的前一

发布时间: 2012-02-15 12:09:44 作者: rapoo

请问怎样把一个已赋值的vector中的前一个元素赋给后一个元素?
我写一个贪食蛇的游戏,因为在游戏中蛇的身长会动态增加,所以我想用vector来记录蛇的每个结点的坐标,但是在改变蛇的坐标(蛇移动)时出了问题,比如向上,就是蛇的第一个结点的纵坐标减一,其余结点的坐标等于它们的前面一个结点的坐标,编程时出了问题。我写了一个测试程序,还是运行错误,请大家帮忙看看。我要做的其实就是相当于在c/c++数组里面的
for(int i = 1; i <n; i++)
Num[i] = Num[i-1];
Num[0]--;
这样的程序。
我写的测试程序如下(编译器devc++4.9.9.2):#include <iostream>


#include <vector>
#include <iterator>

using namespace std;

int main()
{
vector <int> vec;
int i;
for(i = 0; i <5; i++)
vec.push_back(i+2);
for(i = 0; i <5; i++)
{
cout < <vec.at(i) < <endl;
}
//将vec内前一个值赋给后一个
for(i = 1; i <5; i++)
{
vec[i] = vec[i-1];
}
vec[0]--; //vec内第一个值减1
cout < <endl;
for(i = 0; i <5; i++)
{
cout < <vec.at(i) < <endl;
}
//用assign
vector <int> ::iterator itv;
for(itv = vec.begin()+1; itv!= vec.end(); itv++)
{
vec.assign(itv,itv--);
}
vec[0]--;
cout < <endl;
/*如果把注释去掉编译通过但有运行时错误:

for(i = 0; i <5; i++)
{
cout < <vec.at(i) < <endl;
}
*/
system( "pause ");
return 0;
}


其中我用/**/注释掉的一段如果不注释掉结果是这样的:
2
3
4
5
6

1
2
2
2
2

0

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application 's support team for more information.

请问要怎么办?谢谢!

[解决办法]
for(i = 1; i <5; i++)
{
vec[i] = vec[i-1];
}
当然要从后面往前啦。
for(i = 4; i> = 1; --i)

[解决办法]
我大一时候做的时候也遇到这问题 ..呵呵


你让后一个等于前一个,
原来是这样
1 2 3 4 5

头接点- 1, 后面的等于前面的
0 1 1 1 1

你是先让后面的等于前面的再让前面的-1, 但是从第二个开始,已经改变了..

所以你可以用个结构体
typedef struct Node
{
int x;
int y;
int oldx;
int oldy;

}Node;
所以让每个接点等于前面的oldx,oldy之后,再让oldx,oldy更新为最新的位置...
明白我说的意思.??

[解决办法]
其实就是从第二个出了问题

刚开始你先把 头的值给了第二个,然后头 - 1,
但是后面 第二个的值已经改变为第一个的原始的值了, 所以后面所有的节点都为 第一个未改变前的值..

所以蛇显示的长度只是2个节点的长度....(跟我当初遇到一样的问题 呵呵...)

读书人网 >C++

热点推荐