我想知道:我有一些包含一些数据的结构。如果我想删除所有数据并将所有值保留在结构数组中作为默认值,是否可以使用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;
}
编辑: 目前我的编译器说预期;在{之前,所以它似乎无法识别括号初始化器。
答案 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 initializers,simply 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标准会让你超载它(如果有人确定,请评论!)。