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

Is there an easy way to assign a struct array

本文关键字:方法 分配 结构 数组 简单 一种 有没有      更新时间:2023-10-16

我有一个结构数组,如下所示:

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中时。数组在C中是相当破碎的,C++认为std::vector就足够了,任何修复C风格数组的尝试要么都不足以产生影响,要么会破坏兼容性,以至于无法再谈论C风格数组。

对于像您这样的POD阵列,memcpy是迄今为止最简单的解决方案。对于更复杂的情况,甚至是像您这样的struct数组的大多数情况,您可能应该考虑使用std::vector。或者混合使用:将C风格的数组用于静态的初始化数组,例如您显示的数组,这样编译器就会为您计算元素的数量,但将std::vector用于定义中未完全初始化或是赋值目标的任何数组。使用std::vector的两个迭代器构造函数可以很容易地从C风格的数组构造std::vector,因此同时使用这两种类型不会带来任何不便。

如果您的意思是插入一个新值,那么否-数组是固定大小的-您无法轻松更改它。您必须创建一个全新的阵列——您真正应该做的是查看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]);

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

如前所述,在当前版本的c++中没有其他方法可以做到这一点(在c++0x中是可能的)

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

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;