c ++ float *数组作为对std :: vector <float>的引用

时间:2018-11-21 10:39:28

标签: c++ arrays reference stdvector

我想创建一个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,应该如何修改代码?

5 个答案:

答案 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内有一些额外的复杂性,以确保在删除内存空间之前不使用该内存。