Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将数组中的元素移位N个元素_C++_Arrays - Fatal编程技术网

C++ 将数组中的元素移位N个元素

C++ 将数组中的元素移位N个元素,c++,arrays,C++,Arrays,我有一个数组,其中每个“元素”由4个连续值组成。更新后,我将数组向末尾移动4个值,并在开头插入4个新值 班次: int m = 4; for (int i = _vsize - 1; i + 1 - m != 0; i--){ _varray[i] = std::move(_varray[i - m]); } 插入: memcpy(&_varray[0], glm::value_ptr(new_element), 4 * sizeof(float)); 其中,new_元素属

我有一个数组,其中每个“元素”由4个连续值组成。更新后,我将数组向末尾移动4个值,并在开头插入4个新值

班次:

int m = 4;
for (int i = _vsize - 1; i + 1 - m != 0; i--){
     _varray[i] = std::move(_varray[i - m]);
}
插入:

memcpy(&_varray[0], glm::value_ptr(new_element), 4 * sizeof(float));
其中,
new_元素
属于包含所述4个新值的类型
glm::vec4

对如何改进这一点有什么建议吗

(现在我只移动一个元素,但希望能够灵活地移动8次,而不必将其放入循环)

谢谢。你可以试试。您希望将一个范围的值复制到同一容器中的另一个范围。由于范围重叠且您正在向右复制,因此您不能使用常规的
std::copy
,而必须使用
std::copy\u backward

int m = 4; // make this a multiple of your 'element' size
std::copy_backward(&_varray[0], &_varray[_vsize - m], &_varray[_vsize]);

还有,但这并不重要,因为您的
float
值是不可移动的。

std::rotate
做了类似的事情,我想(我从未使用过它,但它会旋转容器内的元素范围,包括数组)这个数据结构还需要什么其他操作?使用反向向量可能是一个想法。也就是说,不是在开头插入,而是在结尾插入。当你想迭代时,按相反的顺序进行(使用
rbegin()
rend()
)基本上,这些都是直线的点。当我的对象移动时,我将“丢弃”最后一个点,并在特定时间间隔后添加一个新点。我希望有一种方法可以快速地将数组向任何方向移动(我的数组是交错的,位置和颜色,都是矢量4)。尝试过这个,不知道我做的是否正确,你的意思是:std::copy_backward(&_varray[0],&_varray[_vsize-4*sizeof(float)],&_varray[_vsize);它报告我读取的数据超过了数组大小。哦,实际上我有浮动,我不知道为什么我写了双精度的,我会编辑。@mike:你根本不需要这样做
*sizeof(float)
缩放。当您使用指针作为迭代器(例如,
&\u varray[0]
)时,编译器知道所指向类型的大小,并为您执行正确的操作。删除该选项后,仍然会使“subscribt超出范围”。执行此操作:std::copy_backward(&_varray[0]、&_varray[_vsize-4]、&_varray[_vsize])@迈克:
\u vsize
是数组中的元素数(不是字节数)吗?如果是这样,
和&u varray[\u vsize]
应该是一个有效的数组迭代器。显示
\u varray
@mike的声明:如果
\u vsize
小于
m
,则计算无效索引也有一定的危险。