C++ 初始化结构向量

C++ 初始化结构向量,c++,vector,initialization,structure,C++,Vector,Initialization,Structure,让我们来看看 struct Vector { float i,j,k; } 我想将下面声明的vec的所有元素归零(I,j,k=0) std::向量向量向量机; 调整向量大小(num,0); 我不想使用reserve()然后逐个推回()零。 另一件事是,在成功初始化vec之后,我想在操作它之后将vec的所有成员再次设置为零。向量有类似于memset的东西吗 编辑: 我比较了Mike Seymour和Xeo的答案中的所有方法,结果 size\u t size=vec.size(); 向

让我们来看看

struct Vector {

    float i,j,k;
}
我想将下面声明的vec的所有元素归零(I,j,k=0)

std::向量向量向量机;
调整向量大小(num,0);
我不想使用reserve()然后逐个推回()零。 另一件事是,在成功初始化vec之后,我想在操作它之后将vec的所有成员再次设置为零。向量有类似于memset的东西吗

编辑: 我比较了Mike Seymour和Xeo的答案中的所有方法,结果
size\u t size=vec.size();
向量清除();

调整向量大小(大小)是最快的。

C++将所有当前元素设置为
0

 std::fill( vec.begin(), vec.end(), 0 );
或者,重新初始化为给定大小:

 vec.clear();
 vec.resize(num, 0);
这可能不如
memset
,但对于99%的情况来说已经足够了。

您可以使用
memset
,只要您的
向量是POD类型:

std::vector<Vector> v(num, 0); // inital fill
// do stuff
memset(&v[0], 0, sizeof(Vector) * v.size());
这很简单:

vec.resize(num);
或使用所需的大小对其进行初始化:

std::vector<Vector> vec(num);
或:

或者,效率较低但有强有力的例外保证:

std::vector<Vector>(vec.size()).swap(vec);
std::vector(vec.size()).swap(vec);

我是否应该在向量中包含0。调整大小(num,0)?因为迈克·西摩没有这样做。他在回答中解释了隐含的初始化。使用默认构造函数(不带0)是可以的。关于重置,哪一个更快,vec.clear。。。或者填充…?@Shibli:它们几乎肯定在速度上非常相似。如果这对你很重要,那么你就必须测量它们。如果速度真的很重要,您可能会发现
memset
稍微快一点(参见Xeo的答案),但更危险,因为如果您修改类型使其不再是POD,它将以未定义的方式中断。再一次,唯一的方法是判断它是否更快,如果它是C++版本或者方法,会发生什么?如果是另一种情况,会发生什么?@Shibli:
std::fill
将适用于任何类型,您可以将其放入
向量中
memset
仅对普通数据(POD)类型有效;如果该类型包含构造函数、析构函数、虚函数或其他复杂内容,则该类型将中断。@Shibli:您可以对字符类型(
char
unsigned char
signed char
)使用
memset
);我不认为它对其他任何类型都是有保证的(尽管我从未见过一个实现,它对其他整数或浮点类型会失败)。从全球来看,这是非常糟糕的做法
std::fill
std::fill\n
适用于所有类型(可能会稍微更有效)。
std::vector<Vector> vec(num);
size_t size = vec.size();
vec.clear();
vec.resize(size);
std::fill(vec.begin(), vec.end(), Vector());
std::vector<Vector>(vec.size()).swap(vec);