gpt4 book ai didi

c++ - 无法为 std::map 设置正确的排序规则

转载 作者:行者123 更新时间:2023-11-30 03:20:14 25 4
gpt4 key购买 nike

我试图将类用作 std::map 中的键。我已经阅读了文档,我知道我必须输入某种排序规则,因为我的 std::map 是一个二叉搜索树。出现问题是因为类键中有另一个类。有人可以给我一些关于如何构建运算符的建议吗?

MasterRenderer 文件

std::map<TexturedModel, std::vector<Entity>> entites;
void MasterRenderer::processEntity(Entity entity)
{
TexturedModel model = entity.getModel();
auto search = entites.find(model);
if (search != entites.end()) {
//found
entites[model].emplace_back(entity);
}
else {
//not found
entites[model].emplace_back(entity);
}
std::cout << entites[model].size() << std::endl;
}

纹理模型.h

    TexturedModel(RawModel model, ModelTextures 
texture)
:m_model(model), m_texture(texture) {

};
friend bool operator<(const TexturedModel& m,
const
TexturedModel& m2) {
return m.m_model < m2.m_model || m.m_model ==
m2.m_model && m.m_texture < m2.m_texture;
}
private:
RawModel m_model;
ModelTextures m_texture;

};

原始模型.h

    unsigned int VaoID;
unsigned int Vertecies;

RawModel(unsigned int vaoID, unsigned int
vertecies)
:VaoID(vaoID), Vertecies(vertecies) {};

friend bool operator <(const RawModel& rhs, const
RawModel& rhs2)
{
return rhs.get() < rhs2.get();
}

friend bool operator ==(const RawModel& rhs, const
RawModel& rhs2)
{
return rhs.get() == rhs2.get();
}

const RawModel* get() const {
return this;
}

模型纹理.h

    ModelTextures(unsigned int ID)
:textureID(ID) {};
friend bool operator<(const ModelTextures& rhs,
const ModelTextures& rhs2)
{
return rhs.get() < rhs2.get();
}
const ModelTextures* get() const{
return this;
}

private:
unsigned int textureID;
float shineDamper = 1.0f;
float reflectivity = 0.0f;
};

最佳答案

friend bool operator<(const ModelTextures& rhs, 
const ModelTextures& rhs2)
{
return rhs.get() < rhs2.get();
}
const ModelTextures* get() const{
return this;
}

这按对象的地址而不是内容排序。这违反了 std::map 的要求。

friend auto as_tie(const ModelTexture& m) {
return std::tie(m.textureID, m.shineDamper, m.reflexivity);
}
friend bool operator<(const ModelTextures& rhs,
const ModelTextures& rhs2)
{
return as_tie(rhs) < as_tie(lhs);
}

TexturedModelRawModel 重复此模式。

如果你卡在您必须手动编写 as_tie 的返回类型或使用 decltype

friend auto as_tie(const ModelTexture& m)
-> decltype(std::tie(m.textureID, m.shineDamper, m.reflexivity))
{
return std::tie(m.textureID, m.shineDamper, m.reflexivity);
}

关于c++ - 无法为 std::map 设置正确的排序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975480/

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