c ++ float * array как ссылка на std :: vector <float> - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу создать std::vector<float> vpd, который будет ссылаться на float*.

float * old = new float[6];
for (int i = 0; i < 6; i++)
{
    old[i] = i;
}
vector<float> vpd(6);
auto refasd = &*vpd.begin();
*refasd = *old;
vpd[0] = 23;
cout << old[0] << endl;

Как мне изменить код, если я хочу получить 23 из cout?

Ответы [ 5 ]

0 голосов
/ 21 ноября 2018

В качестве альтернативы вы можете использовать std::span (C ++ 20)

float* old = new float[6];
std::iota(old, old + 6, 0);
std::span<float> vpd(old, 6);
vpd[0] = 23;
std::cout << old[0] << std::endl;
delete[] old;
0 голосов
/ 21 ноября 2018

Поскольку std::vector имеет собственную структуру памяти, вы не можете отобразить vector<float> или даже vector<float*> в массив с плавающей точкой.Однако вы можете отобразить каждый элемент вектора в массив.

float* old = new float[6];
for (int i = 0; i < 6; i++)
{
    old[i] = i;
}
vector<float*> vpd(6);
int i = 0;
for (auto it = vpd.begin(); it != vpd.end(); it++)
{
    *it = &old[i++];
}
*vpd[0] = 23;
*vpd[2] = 45;
cout << old[0] << endl << old[2] << endl;    

Вывод

23
45
0 голосов
/ 21 ноября 2018

Вы также можете создать vector из std::reference_wrapper объектов, которые ссылаются на исходный массив float - это может быть std::vector<float> или new ed float*.Пример:

vector<std::reference_wrapper<float>> vpd(old, old + 6); // ¹

vpd[0].get() = 23.f;

cout << old[0] << endl; // prints 23

¹) Спасибо @StoryTeller за указание, что vpd может быть инициализирован напрямую.

0 голосов
/ 21 ноября 2018

В зависимости от версии C ++ у вас будет несколько вариантов (если я понимаю проблему): если у вас более старая версия c ++, то c ++ 11 я бы в этом случае объявил std :: vector как:

// then you really need to make sure u delete the memory as well
std::vector<float*> vpd(6); 

Если, однако, у вас есть c ++ 11 или выше, я бы использовал либо std :: share_ptr, либо std :: unique_ptr, в зависимости от того, хотите вы разделить пространство памяти или нет.Либо это будет гарантировать, что память будет удалена сама по себе, без необходимости делать «delete float *;»что приятноВы можете прочитать о std :: shared_ptr по адресу: https://en.cppreference.com/w/cpp/memory/shared_ptr и std :: unique_ptr по адресу: https://en.cppreference.com/w/cpp/memory/unique_ptr

// For unique_ptr
std::vector<std::unique_ptr<float>> vpd(6);
// for std::shared_ptr
std::vector<std::shared_ptr<float>> vpd(6);

Я бы сказал, что если вы затем можете использовать unique_ptr, а не shared_ptr из-заshared_ptr имеет некоторую дополнительную сложность, чтобы убедиться, что память не используется перед удалением памяти.

0 голосов
/ 21 ноября 2018

Вы не можете.std::vector не предназначен для владения необработанным указателем.
Возможно, вы можете обойтись с std::unique_ptr<float[]>, но лучшим решением будет прямое использование std::vector.

...