Копирование элементов std::vector
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 02.09.19 09:40
Оценка: -1
Есть некоторая структура 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 ?
1613 г. = 2024 г.
Отредактировано 02.09.2019 9:41 RussianFellow . Предыдущая версия .
Re: Копирование элементов std::vector
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.09.19 09:45
Оценка: +1
reserve() — если ты точно не знаешь конечный размер. если же знаешь — тогда сразу resize()
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: Копирование элементов std::vector
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 02.09.19 10:15
Оценка:
Здравствуйте, niXman, Вы писали:

X>reserve() — если ты точно не знаешь конечный размер. если же знаешь — тогда сразу resize()


То есть можно при помощи resize решить мою задачу?
1613 г. = 2024 г.
Re[3]: Копирование элементов std::vector
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.09.19 10:19
Оценка: +1 -1
Здравствуйте, RussianFellow, Вы писали:

RF>То есть можно при помощи resize решить мою задачу?

да, но только если ты планируешь "вставлять" елементы по индексу. если же при помощи push_back() — тогда reserve() а потом push_back().


up
если ты планируешь вставлять при помощи push_back() — тогда вообще можешь не заморачиваться ни с resize(), ни с reserver()
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 02.09.2019 10:21 niXman . Предыдущая версия .
Re[2]: Копирование элементов std::vector
От: sergii.p  
Дата: 02.09.19 10:19
Оценка: -2
Здравствуйте, niXman, Вы писали:

X>reserve() — если ты точно не знаешь конечный размер. если же знаешь — тогда сразу resize()


я бы не стал использовать resize вовсе. Она выделяет память и пытается проинициализировать недостающие значения. А зачем их инициализировать, если всё равно позже перезапишем?
Re[3]: Копирование элементов std::vector
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.09.19 10:23
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>я бы не стал использовать resize вовсе. Она выделяет память и пытается проинициализировать недостающие значения. А зачем их инициализировать, если всё равно позже перезапишем?


%)

не зная контекста задачи я вообще бы не стал задумываться об этом...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: Копирование элементов std::vector
От: SaZ  
Дата: 02.09.19 13:28
Оценка: -1
Здравствуйте, niXman, Вы писали:

X>up

X>если ты планируешь вставлять при помощи push_back() — тогда вообще можешь не заморачиваться ни с resize(), ни с reserver()

Почему? Как раз таки стандартный подход это дёрнуть reserve (если он есть), а потом через push_back набивать контейнер. Для вектора это будет самый эффективный способ.
Re[5]: Копирование элементов std::vector
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.09.19 13:33
Оценка: -1
Здравствуйте, SaZ, Вы писали:

SaZ>Почему?


потому что выше ответил.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Копирование элементов std::vector
От: AleksandrN Россия  
Дата: 02.09.19 21:53
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

RF>Есть некоторая структура MyStruct, например такая:


RF>
RF>typedef struct
RF>{
RF>    long double  field1;
RF>    long double  field2;
RF>    //...
RF>    long double  fieldN;
RF>} My_Struct;
RF>


Зачем нужна такая структура вместо std::vector?
Re[5]: Копирование элементов std::vector
От: AlexGin Беларусь  
Дата: 03.09.19 07:53
Оценка: -1
Здравствуйте, уважаемый SaZ, Вы писали:

SaZ>Почему? Как раз таки стандартный подход это дёрнуть reserve (если он есть), а потом через push_back набивать контейнер. Для вектора это будет самый эффективный способ.


Вот примеры стандартных способов:
https://en.cppreference.com/w/cpp/container/vector/push_back
http://www.cplusplus.com/reference/vector/vector/push_back

Как видим, никаких вызовов reserve перед выполнением push_back не требуется.
Вектор (std::vector<...>) сам выделяет (и периодически перевыделяет) память для своего содержимого.

Если делаем 'reserve' — выделяется память внутри 'вектора' — это можно делать, если затем последует, например миллион push_back-ов
В этом случае, время на перевыделение будет сэкономлено (также не будет фактора "фрагментации_кучи").

Вот примеры:
http://www.cplusplus.com/reference/vector/vector/reserve
https://stackoverflow.com/questions/13029299/stdvectorresize-vs-stdvectorreserve
Отредактировано 03.09.2019 9:34 AlexGin . Предыдущая версия .
Re[2]: Копирование элементов std::vector
От: Sergey_BG Россия  
Дата: 03.09.19 09:01
Оценка: +1
Здравствуйте, AleksandrN, Вы писали:
AN>Зачем нужна такая структура вместо std::vector?
тогда уж std::array
Сергей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.