Requisito para a chave em std :: multimap
Pergunta
Eu tenho um std :: multimap onde chave é uma classe personalizada. Algo parecido com isto:
Class X {
public:
std::string s;
int x;
operator <(const X& other) const { return s < other.s; }
};
std::multimap<X, int> mymap;
Agora, eu gostaria de usar upper_bound e lower_bound para iterar sobre todos os elementos com o mesmo valor de "s". Eu preciso implementar algum outro operador para X (por exemplo: ==). Ou será que vai funcionar corretamente como esta?
Além disso, o que devo fornecer como argumento para upper_bound e lower_bound ? Eu suponho que eu deveria criar um objeto fictício com o valor desejado de "s"?
Solução
Desde class X
é a chave para o multimap, o parâmetro para as necessidades upper_bound()
/ lower_bound()
ser desse tipo. Se class X
tem uma conversão implícita de std::string
(que é o tipo de X::s
), então você pode usar isso como o parâmetro para upper_bound()
/ lower_bound()
.
A comparação padrão para multimap é less<>
que simplesmente chama operator <()
- de modo que é a única operadora lhe uma obrigados a ter em class X
para o multimap ao trabalho
Outras dicas
você só precisa fornecer um operador == e <.
upper_bound e lower_bound são como qualquer outro método do tipo achado, então você precisa o mesmo tipo de objeto para comparar com -. No seu caso, um objeto 'fictício' com o valor necessário de s
Editar : Os comentários são correto que você só precisa de operador Os 2 sobrecargas que você precisa para todos os contêineres STL são operador É claro, a questão também poderia ser respondida mais plenamente através da implementação de um functor de comparação no próprio mapa, não contando com os objetos. Isso é muitas vezes uma boa maneira de implementar diferentes formas de chamar find () no mapa.