Есть некоторая структура MyStruct, например такая:
typedef struct
{
long double field1;
long double field2;
//...long double fieldN;
} My_Struct;
И есть вектор (std::vector) vect1, содержащий элементы типа My_Struct.
Я хочу создать другой вектор vect2, содержащий элементы типа My_Struct, который я заполняю элементами из первого вектора по своему определённому правилу--например, 0-ой элемент вектора vect1 я ставлю в 10-ую позицию вектора vect2, 1-ый элемент вектора vect1 я ставлю в 5-ую позицию вектора vect2, 2-ой элемент вектора vect1 я ставлю в 8-ую позицию вектора vect2.
Соответствующий код:
vector<My_Struct> vect1, vect2;
// заполнение вектора vect1 элементами с инициализацией полей у каждого элемента;
n = vect1.size();
vect2.reserve(n);
vect2.resize(n);
vect2[10] = vect1[0];
vect2[5] = vect1[1];
vect2[8] = vect1[2];
Вопрос состоит в следующем--для выделения памяти для второго вектора vect2 достаточно ли пользоваться функцией reserve или же надо вместо этого сделать цикл от 0 до n, в котором вызывалась бы функция push_back, параметром которой была бы переменная структурного типа My_Struct? Как правильно выделить память для второго вектора vect2 ?
Здравствуйте, RussianFellow, Вы писали:
RF>То есть можно при помощи resize решить мою задачу?
да, но только если ты планируешь "вставлять" елементы по индексу. если же при помощи push_back() — тогда reserve() а потом push_back().
up
если ты планируешь вставлять при помощи push_back() — тогда вообще можешь не заморачиваться ни с resize(), ни с reserver()
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>reserve() — если ты точно не знаешь конечный размер. если же знаешь — тогда сразу resize()
я бы не стал использовать resize вовсе. Она выделяет память и пытается проинициализировать недостающие значения. А зачем их инициализировать, если всё равно позже перезапишем?
Здравствуйте, sergii.p, Вы писали:
SP>я бы не стал использовать resize вовсе. Она выделяет память и пытается проинициализировать недостающие значения. А зачем их инициализировать, если всё равно позже перезапишем?
%)
не зная контекста задачи я вообще бы не стал задумываться об этом...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>up X>если ты планируешь вставлять при помощи push_back() — тогда вообще можешь не заморачиваться ни с resize(), ни с reserver()
Почему? Как раз таки стандартный подход это дёрнуть reserve (если он есть), а потом через push_back набивать контейнер. Для вектора это будет самый эффективный способ.
Здравствуйте, уважаемый SaZ, Вы писали:
SaZ>Почему? Как раз таки стандартный подход это дёрнуть reserve (если он есть), а потом через push_back набивать контейнер. Для вектора это будет самый эффективный способ.
Как видим, никаких вызовов reserve перед выполнением push_back не требуется.
Вектор (std::vector<...>) сам выделяет (и периодически перевыделяет) память для своего содержимого.
Если делаем 'reserve' — выделяется память внутри 'вектора' — это можно делать, если затем последует, например миллион push_back-ов
В этом случае, время на перевыделение будет сэкономлено (также не будет фактора "фрагментации_кучи").