将 std::vector 分配给方法内部的指针
Assigning std::vector to pointer inside a method
我想创建一个方法,它使用 std::vector
s 建立一个数据集合,然后对数据进行一些操作,最后,我想通过一个指针传递生成的信息给定参数,如这个小示例所示:
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被破坏,指针不显示。
如何正确处理这个问题?那么如何在不取消分配的情况下将这个集合分配给一个指针呢?
您需要将函数设为局部 vectorList
、static
并使用 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
我想创建一个方法,它使用 std::vector
s 建立一个数据集合,然后对数据进行一些操作,最后,我想通过一个指针传递生成的信息给定参数,如这个小示例所示:
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被破坏,指针不显示。
如何正确处理这个问题?那么如何在不取消分配的情况下将这个集合分配给一个指针呢?
您需要将函数设为局部 vectorList
、static
并使用 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