C ++ - 如何在我的数组中放置一个静态数组?

时间:2012-12-20 01:21:50

标签: c++ arrays

我为整个noob问题道歉,但我找不到答案。我用Google搜索,在这里搜索,搜索C ++数组文档,以及一些C ++数组教程 问题很简单。为什么

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
      short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}};
      ... //do stuff.  Imagine a loop here, and BIG array - I'm just simplifying it for StackOverflow
      pixelarray = {{1,0,-1},{1,0,-1},{1,0,-1}};

    return 0;
}

导致错误?

1>arraytest.cpp(11): error C2059: syntax error : '{'

如何在阵列中放置静态数组?我意识到我可以单独设置每个项目,但必须有更好的方法。

6 个答案:

答案 0 :(得分:6)

C ++中的内置数组存在问题,而且不可分配确实使它们变得不灵活。我坚持使用std::array,这是一个C ++ 11容器,它可以模拟更好的数组样式,它允许使用与您正在寻找的语法类似的语法:

std::array<int, 3> arr{{1, 2, 3}};
std::array<int, 3>{{4, 5, 6}}.swap(arr);
//now arr is {4, 5, 6}

这是一个full sample。诀窍是在新构造的数组上使用初始化列表,然后将其与您的交换。我相信下一个C ++更新也将消除对双括号的需求,这使得它与熟悉的语法更加匹配。

答案 1 :(得分:3)

初始化列表只能用于初始化:)
就像声明你的变量一样:

short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}}; // this is ok

你必须删除它:

pixelarray = {{1,0,-1},{1,0,-1},{1,0,-1}};

手动分配新值(即pixelarray[x][y] =memcpy(pixelarray, <some other array>, sizeof(pixelarray))

答案 2 :(得分:2)

如果您不想手动分配每个元素,可以执行以下操作:

short pixelarray2[3][3] = {{1,0,-1},{1,0,-1},{1,0,-1}};
memcpy(pixelarray, pixelarray2, sizeof(pixelarray));

正如@Nick所指出的那样:初始化列表不适用于分配。

答案 3 :(得分:2)

阵列不可分配,所以简短的回答是你不能完全按照你的要求去做。为大多数目的做类似事情的最直接方法可能是一个2D数组类,它作为std::vector的包装器,按照我在previous answer中发布的那个顺序。

如果你坚持使用C风格的数组,一种可能就是使用指针:

int main() { 
    typedef short array[3];

    array pixelarray0[3] = {{1,1,1},{0,0,0},{-1,-1,-1}};
    array pixelarray1[3] = {{1,0,-1},{1,0,-1},{1,0,-1}};

    array *pixelarray = pixelarray0;

    // when needed:
    pixelarray = pixelarray1;
}

答案 4 :(得分:2)

从直接C语境中提取此问题,您可以使用不同的常量数组,只需使用memcpy复制它们:

typedef short TArray[3][3];
const TArray a1 = {{1,1,1},{0,0,0},{-1,-1,-1}};
const TArray a2 = {{1,0,-1},{1,0,-1},{1,0,-1}};

// ...    
TArray a;
memcpy( a, a2, sizeof(TArray));

或者你可以利用C99结构复制,但我认为这是一个危险的黑客,因为结构可能被填充为大于数组,或具有不同的对齐。

typedef struct {
    TArray arr;
} TDummyArray;

// ...
TArray a;
*(TDummyArray*)a = *(TDummyArray*)a2;

答案 5 :(得分:0)

一旦声明了数组,就无法使用赋值运算符重新分配数组的整个内容。

所以在此之后更改内容或数组:

short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}};

您需要循环遍历数组并手动更改每个值,或者您需要使用std :: memcpy来复制新值。

但是你应该首先使用数组,使用std集合库中的一些代替std :: array或std :: vector。如果你有一个非常好的理由不能使用集合,那么只使用数组。