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);