是否有一种简单的方法来分配结构数组

时间:2011-06-08 07:19:43

标签: c++ struct

我有一个像这样的结构数组:

struct VERTEX_FMT
{
    float x, y, z, u, v;
    const static DWORD FVF = (D3DFVF_XYZ | D3DFVF_TEX1);
};
VERTEX_FMT vertices[] = {
    {-1.0f, -1.0f,  0.0f,  0.0f,  0.0f},
    {-1.0f,  1.0f,  0.0f,  0.0f,  1.0f},
    { 1.0f, -1.0f,  0.0f,  1.0f,  0.0f},
    { 1.0f,  1.0f,  0.0f,  1.0f,  1.0f},
};

是否有一种简单的方法可以在C ++中为struct数组分配一个新值。

4 个答案:

答案 0 :(得分:2)

仅当您将数组包装在另一个struct中时。在C语言中,数组非常破碎,而且C ++认为std::vector已经足够了,并且任何修复C样式数组的尝试都不会有足够的效果,或者会破坏兼容性。再也不谈C风格的数组了。

对于像你这样的POD阵列,memcpy是迄今为止最简单的解决方案。对于更复杂的情况,甚至大多数struct的数组都与您的情况一样,您应该考虑使用std::vector。或者混合:将C样式数组用于静态的初始化数组,例如您显示的数组,以便编译器为您计算元素的数量,但对于未完全初始化的任何内容,请使用std::vector定义,或者是作业的目标。使用std::vector的两个迭代器构造函数从C样式数组构造std::vector很容易,因此两种类型都没有真正的不便。

答案 1 :(得分:1)

如果你的意思是插入一个新值,那么不 - 数组是固定大小的 - 你不能轻易地改变它。你必须创建一个全新的数组 - 你应该做的是看std::vector

std::vector<VERTEX_FMT> new_array(vertices, vertices + sizeof(vertices)/sizeof(VERTEX_FMT));
// add the new entry in
new_array.push_back(...);

编辑:根据评论,您想要做的事情似乎是:

vertices[2] = {....}; // new values.

在当前标准中执行此操作的最快方法是使用std::memcpystd::copy,例如:

VERTEX_FMT nv = { ... };
// copy this in
std::memcpy(&vertices[2], &nv, sizeof(nv));
// the line below also works if you want to use purely standard algorithms.
//std::copy(&nv, (&nv) + 1, &vertices[2]);

答案 2 :(得分:0)

您可以使用std::generate或其他一些stl算法函数。

正如已经说过的,在当前版本的c ++中没有其他方法可以做到这一点(它可能在c ++ 0x中)

答案 3 :(得分:0)

在当前标准中,不能执行,

int a[3] = {1,2,3};
a[] = {4,5,6};

但是你可以使用指向数组类型的指针

来获得它的效果
int a[3] = {1,2,3}, (*p)[3]; // <-- this syntax forces p to point only int[3]
p = &a;
int b[3] = {4,5,6,};
p = &b;