C++ 指向 unordered_map 条目的指针发生变化,但条目没有

标签 c++ pointers reference

我正在尝试通过使用指向该条目的指针调用函数来设置 unordered_map 条目“chunk”的变量。指针更改其值“chunkIndex”,但映射条目未更改

glm::ivec3 chunkIndex(1, 1, 1);
chunks.insert(make_pair(chunkIndex, Chunk()));
chunk = &chunks[chunkIndex];
chunk->setChunkIndex(chunkIndex);

logVector(chunk->chunkIndex);                      // output: 1, 1, 1
logVector(chunks[chunk->chunkIndex].chunkIndex);   // output: 0, 0, 0

“ block ”是一个 unordered_map 类型:

typedef unordered_map<glm::ivec3, Chunk, KeyHash, KeyEqual> ChunkMap;

你知道为什么只有指针改变了它的值,而不是引用的对象吗?

提前致谢!

更新:

chunks.insert(make_pair(chunkIndex, Chunk()));
log((chunks.find(chunkIndex) == chunks.end()) ? "true" : "false");

此代码输出 true,因此插入的条目实际上不存在!

这也可能有用:

struct KeyHash
{
    size_t operator()(const glm::ivec3& k)const
    {
        return std::hash<int>()(k.x) ^ std::hash<int>()(k.y) ^ std::hash<int>()(k.z);
    }
};
struct KeyEqual
{
    bool operator()(const glm::ivec3& a, const glm::ivec3& b)const
    {
        return a.x < b.x || (a.x == b.x && a.y < b.y) || (a.x == b.x && a.y == b.y && a.z < b.z);
    }
};

typedef unordered_map<glm::ivec3, Chunk, KeyHash, KeyEqual> ChunkMap;

遍历键也输出 1, 1, 1

for (auto it : chunks) {
    logVector(it.first);
}

最佳答案

您的 KeyEqual 没有实现相等性。将其替换为:

return a.x == b.x && a.y == b.y && a.z == b.z;

关于C++ 指向 unordered_map 条目的指针发生变化,但条目没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590180/

相关文章:

c++ - 通过指向 self 的非 const 指针在 const 方法中修改 self

c++ - 如何将对象列表从 C++ 传递到 Lua?

c++ - 套接字错误无法在 WinSock2.h 中获取函数

c++ - 删除数组指针堆损坏

ms-access - Solidworks 2016 SaveAs Access VBA 运行时错误 438

C++ TCP套接字发送速度

pointers - 为什么Go允许将接口(interface)变量分配给未实现值接收者的值?

c++ - 我能保证所有指针都具有相同的字节大小吗?

reference - SAS 袖珍引用

html - 在 CSS 中通过引用调用?