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"?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top