初始化结构的向量

时间:2012-01-05 14:58:43

标签: c++ vector initialization structure

我们有

struct Vector {

    float i,j,k;
}

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

std::vector <Vector> vec;
vec.resize(num,0);

我不想使用reserve()然后push_back()逐个零。 另一件事是,在成功初始化vec之后,我想在操作之后将vec的所有成员再次设置为零。是否有类似memset的载体?

修改 我比较了Mike Seymour和Xeo的答案中的所有方法 如果它们在循环中频繁重复,size_t size = vec.size(); vec.clear(); vec.resize(size);是最快的。

3 个答案:

答案 0 :(得分:7)

这很简单:

vec.resize(num);

或用所需大小初始化它:

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

构造函数和resize都将使用值初始化对象填充新元素。没有默认构造函数的类型初始化对象(例如Vector)将使所有数字成员初始化为零。

要将所有内容重置为零,

size_t size = vec.size();
vec.clear();
vec.resize(size);

或:

std::fill(vec.begin(), vec.end(), Vector());

或效率较低但具有强大的异常保证:

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

答案 1 :(得分:1)

将所有当前元素设置为0的C ++方式:

 std::fill( vec.begin(), vec.end(), 0 );

或者,或者,重新初始化为给定的大小:

 vec.clear();
 vec.resize(num, 0);

这可能不如memset那样有效,但足以满足99%的情况。

答案 2 :(得分:1)

可以只使用memset,只要你的Vector是POD类型:

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

虽然C ++版本将与std::fill

一起使用
#include <algorithm>

std::fill(v.begin(), v.end(), 0);