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