C++ массив float* как ссылка на std::vector<float>

Я хочу создать 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 ответов

В качестве альтернативы вы можете использовать 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;

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

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

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

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

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

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

Как 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

В зависимости от версии 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 имеет некоторую дополнительную сложность, чтобы убедиться, что память не используется перед удалением пространства памяти.

Другие вопросы по тегам