gpt4 book ai didi

c++ - 将对象的值保存在 vector 中,并将指针保存在 map 中。它是否正确?

转载 作者:行者123 更新时间:2023-12-02 09:51:21 25 4
gpt4 key购买 nike

我对 std::vector 中对象指针的有效性有疑问s。我不确定以下示例中的内存是否正确保存以及我是否以我打算的方式访问指针:

// class which should hold the 4 Indices
struct Face
{
Face(){};
Face(std::array<int, 4> indices) : Indices(indices) // array is copied and saved in face object
{}
std::array<int, 4> Indices{};
}

static void CreateAndStoreFace(const std::array<int, 4>& indices,
std::vector<Face>& faces,
std::map<int, Face*>& indexToFaces)
{
Face f(indices); // create a face on the stack, indices are copied
faces.push_back(f); // pushed into vector, face is copied on "vector-heap"
for(const auto& index : indices)
{
indexToFaces[index] = &faces[faces.size() - 1]; // face pointer is saved in map
}
}
所以我的问题是, map 中的指针是指向正确的对象?是堆上的脸,以后可以从 vector内部使用吗?和 map ?
我想你明白我想要做什么,你看到一个更简单(或正确)的实现吗?

最佳答案

这取决于您如何使用 CreateAndStoreFace功能。如果 faces 的生命周期长于 indexToFaces ,以及 faces vector 不会使其引用无效(例如,在另一个 push_back 之后),然后映射中的指针始终指向正确的内存块。

std::vector<Face> faces;
std::map<int, Face*> indexToFaces;
CreateAndStoreFace(indices, faces, indexToFaces);
// indexToFaces[someIdx] returns a pointer pointing to some Face

std::map<int, Face*> indexToFaces;
{
std::vector<Face> faces;
CreateAndStoreFace(indices, faces, indexToFaces);
}
// indexToFaces[someIdx] using this pointer is undefined behavior

std::vector<Face> faces;
std::map<int, Face*> indexToFaces;
CreateAndStoreFace(indices, faces, indexToFaces);
faces.push_back(anotherFace);
// indexToFaces[someIdx] using this pointer is undefined behavior - vector might invalidate the references

顺便说一句,而不是 faces[faces.size() - 1]你可以 faces.back()

关于c++ - 将对象的值保存在 vector 中,并将指针保存在 map 中。它是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64388243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com