是否可以使用大括号初始化程序擦除结构数组?

时间:2014-01-23 09:39:25

标签: c++11

我想知道:我有一些包含一些数据的结构。如果我想删除所有数据并将所有值保留在结构数组中作为默认值,是否可以使用C ++ 11括号初始值设定项?

#include <iostream>

using namespace std;

typedef struct{
 int i;
 char a;
}mystruct;

int main()
{
    mystruct structure[2];
    structure{};
    structure[0].i = 69;
    cout << structure[0].i << endl; // Should print 69
    structure{};
    cout << structure[0].i << endl; //Should print 0

   return 0;
}

编辑: 目前我的编译器说预期;在{之前,所以它似乎无法识别括号初始化器。

4 个答案:

答案 0 :(得分:4)

原始数组不能在C ++中复制 - use std::array instead

#include <array>
#include <iostream>

using namespace std;

struct mystruct {
  int i;
  char a;
};

int main()
{
    std::array<mystruct, 2> structure = {};
    structure[0].i = 69;
    cout << structure[0].i << endl; // Should print 69
    structure = {};
    cout << structure[0].i << endl; //Should print 0
}

If your compiler whines about missing initializerssimply double them up to {{}}

答案 1 :(得分:1)

structure{};无效。如果要擦除数组中的所有结构,我不会看到如何使用单个赋值来完成它。但是你可以在单个数组元素上使用这样的赋值,例如

structure[0] = {};

答案 2 :(得分:1)

您的结构应该有一个默认构造函数,以便为其字段定义值。

例如:

struct mystruct {
    int a  = 1;
    char c = 'a';
};

mystruct s1;
assert(s1.a == 1);

然后您可以通过指定默认构造值来“擦除”:

s1.a = 2;
s1 = mystruct();
assert(s1.a == 1);

为数组执行此操作是恕我直言。

修改

我应该已经提到过,当同等分配非静态成员时,结构将不再是聚合。也就是说,不再可能进行聚合初始化:

mystruct x{1,2};  // fails to compile

虽然这会调用隐式的default-ctor:

mystruct x{};

答案 3 :(得分:0)

一个可能的解决方案(如果你可以包括algorithm):

#include <iostream>
#include<algorithm>
using namespace std;

typedef struct{
 int i;
 char a;
 void erase(){i=0; a=0;}
}mystruct;

int main()
{
    mystruct structure[2];
    //structure{};
    structure[0].i = 69;
    cout << structure[0].i << endl; // Should print 69
    //structure{};
    std::for_each(structure,  structure+2, [&](mystruct& s){s.erase();} );
    cout << structure[0].i << endl; //Should print 0

   return 0;
}

编辑:我试图用原始数据结构保持代码清洁(即避免std::vector)。关于花括号,我不认为C ++ 11标准会让你超载它(如果有人确定,请评论!)。