Инициализировать вектор структур - PullRequest
3 голосов
/ 05 января 2012

Давайте у меня будет

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 для векторов?

EDIT: Я сравнил все методы в ответах Майка Сеймура и Xeo, и в результате size_t size = vec.size(); vec.clear(); vec.resize(size); самый быстрый, если они часто повторяются впетля.

Ответы [ 3 ]

7 голосов
/ 05 января 2012

Это очень просто:

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 голос
/ 05 января 2012

Вы можете просто использовать 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);
1 голос
/ 05 января 2012

C ++ способ установки всех текущих элементов на 0:

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

Или, альтернативно, повторно инициализировать до заданного размера:

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

Это может быть не так эффективно, как memset, но достаточно для 99% случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...