不能正确地将我的排序规则用于std :: map

时间:2018-10-24 18:09:14

标签: c++ stdmap

我试图将一个类用作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;
}

TexturedModel.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;

};

Rawmodel.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;
}

ModelTextures.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;
};

1 个答案:

答案 0 :(得分:2)

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);
}