функция копирования c ++ stl правильное управление памятью - PullRequest
0 голосов
/ 25 июля 2011

Просто в следующем коде мне нужно выделить память новой для floatArray или функция копирования выделит память для меня?

Также можно ли копировать постоянный вектор в массив таким образом?Зачем?

vector<float> floatVector;
//filled floatVector here

float *floatArray = new float[floatVector.size()];
copy(floatVector.begin(),floatVector.end(),floatArray);          
delete[] floatArray;

Ответы [ 5 ]

4 голосов
/ 25 июля 2011

std::copy не выделяет память, вы должны сделать это самостоятельно.

2 голосов
/ 25 июля 2011

Если вы не хотите сначала выделять массив, вы можете использовать итератор back_inserter для помещения элементов один за другим в определенные контейнеры. Для некоторых контейнеров это менее эффективно (я думаю), но иногда может быть очень удобно.

#include<iterator>
#include<vector>
#include<deque>

std::vector<float> floatVector(10,1.0);
std::deque<float>  floatDeque; //memory not allocated

//insert elements of vector into deque.
std::copy(floatVector.begin(), floatVector.end(), std::back_inserter(floatDeque));
0 голосов
/ 27 июля 2011

функция копирования никогда не выделяет память, но вы должны выделять память для статических структур данных, но для динамических структур данных она автоматически выделяет память.тот floatarray

0 голосов
/ 25 июля 2011

std :: copy copy, используя оператор присваивания аргументов ("=") или конструктор копирования аргументов (это, вероятно, зависит от реализации, сейчас я не уверен).Он ничего не делает, только перебирает диапазон, начинающийся с param.begin () до param.end (), и делает что-то вроде:

while (first!=last) *result++ = *first++;

Таким образом, вам нужно самостоятельно выделить необходимую память.В противном случае это приведет к неопределенному поведению.

Можно ли копировать вектор констант в массив таким образом?Зависит от того, что вы хотите сделать.Как правило, это нормально, поскольку значения передаются в цель по значению, а не по ссылке, следовательно, правильность const не нарушается.

Например, это прекрасно работает:

std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
const std::vector<int> constvec(vec);

int *arrray = new int[2];
std::copy(constvec.begin(),constvec.end(),arrray);
0 голосов
/ 25 июля 2011

копия не будет выделяться для вас, так что да, вам нужно выделить ее.

...