我想创建一个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
,应该如何修改代码?
答案 0 :(得分:5)
不能。 std::vector
并非旨在获取原始指针的所有权。
也许您可以使用std::unique_ptr<float[]>
,但是更好的解决方案是直接使用std::vector
。
答案 1 :(得分: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;
答案 2 :(得分:4)
您还可以创建vector
个对象,其中std::reference_wrapper
个对象,这些对象引用原始的float
数组-可以是std::vector<float>
或new
ed {{ 1}}。一个例子:
float*
¹)感谢@StoryTeller指出vector<std::reference_wrapper<float>> vpd(old, old + 6); // ¹
vpd[0].get() = 23.f;
cout << old[0] << endl; // prints 23
可以直接初始化。
答案 3 :(得分:2)
由于std::vector
有其自己的内存结构,因此无法将vector<float>
甚至vector<float*>
映射到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
答案 4 :(得分:0)
根据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,具体取决于您是否希望共享内存空间。否则,这将确保自己删除内存,而不必执行“删除浮点*”;很好 您可以在https://en.cppreference.com/w/cpp/memory/shared_ptr上阅读有关std :: shared_ptr的信息,并在https://en.cppreference.com/w/cpp/memory/unique_ptr上阅读有关std :: 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内有一些额外的复杂性,以确保在删除内存空间之前不使用该内存。