将 std::vector 分配给方法内部的指针

Assigning std::vector to pointer inside a method

我想创建一个方法,它使用 std::vectors 建立一个数据集合,然后对数据进行一些操作,最后,我想通过一个指针传递生成的信息给定参数,如这个小示例所示:

struct MyStruct
{
    int* list;
    int entry_count;
};




static MyStruct createList()
{
   vector<int> vectorList;
   MyStruct data;

   vectorList.push_back(1);
   vectorList.push_back(1);
   vectorList.push_back(1);
   vectorList.push_back(1);
   vectorList.push_back(1);

   data.list = &vectorList.front();
   data.entry_count = vectorList.size();
   return data;
}

int main(int argc, char** argv)
{
   MyStruct data;
   data = createList();

   return 1;
}

问题是,方法关闭后,vector被破坏,指针不显示。

如何正确处理这个问题?那么如何在不取消分配的情况下将这个集合分配给一个指针呢?

您需要将函数设为局部 vectorListstatic 并使用 std::vector::data 通过指针获取底层数组。

void createList(int* list)
{
   static std::vector<int> vectorList;
   // ...
   list = vectorList.data();
}

然而,这使得 vectorList 成为所有 createList 函数调用中的唯一实例。如果您需要不同的 vectorList 用于不同的函数调用,我建议将所有包装成 class.

#include <vector>

class MyList /* final */
{
   std::vector<int> mVectorList;

public:
   // operations via functions

   int* data() /* const noexcept */  // ---> provide a member to acces the underlying data
   {
      return mVectorList.data();
   }
};

您需要构建您的代码,使拥有的 std::vector 超过使用指向其缓冲区的任何指针的范围。示例:

void createList(std::vector<int>& storage, int *first)
{
    storage.push_back(42);

    first = storage.data();
}

// in main, or any function:

std::vector<int> storage;
int *first = nullptr;

createList(storage, first);

在这里,我们将 storage 作为 引用 传递(注意 &),因此对它的任何更改都会对创建的实际对象进行调用范围。

请注意,一旦您更改 storage,请务必记住 first 可能是无效引用,因为 std::vector 可能会在添加新元素时重新分配并移动其缓冲区。

根据您的用例,如果最初不需要创建矢量,则可以按照以下方法进行操作。

#include <iostream>
#include <vector>

using namespace std;

int* createList()
{
    static std::vector<int> internalList;
    internalList.push_back(42);
    return internalList.data();
}


int main(int argc, char** argv)
{
    int *first = nullptr;
    first = createList();
    std::cout<<*first;

    return 0;
}

方法是声明一个静态向量,然后使用std::vector::data()方法return指向第一个元素的指针。 如需更多参考,请关注 C++ Documentation