Que problema isso resolve,
Veja a resposta de Dietmar e resposta de remyabel .
e isso muda a forma como os contêineres padrão funcionam?
Não, não por padrão.
As novas sobrecargas de modelo de função de membro findetc. permitem que você use um tipo que é comparável à chave do contêiner, em vez de usar o próprio tipo de chave. Veja N3465 de Joaquín Mª López Muñoz para justificativa e uma proposta detalhada e cuidadosamente escrita para adicionar este recurso.
Na reunião de Bristol, o LWG concordou que o recurso de pesquisa heterogênea era útil e desejável, mas não podíamos ter certeza de que a proposta de Joaquín seria segura em todos os casos. A proposta do N3465 teria causado sérios problemas para alguns programas (consulte a seção Impacto no código existente ). Joaquín preparou um projeto de proposta atualizado com algumas implementações alternativas com diferentes compensações, o que foi muito útil para ajudar o LWG a entender os prós e os contras, mas todos corriam o risco de quebrar alguns programas de alguma forma, então não houve consenso para adicionar o recurso. Decidimos que, embora não seja seguro adicionar o recurso incondicionalmente, seria seguro se fosse desabilitado por padrão e apenas "opt in".
A principal diferença da proposta do N3657 (que foi uma revisão de última hora por mim e STL com base no N3465 e um rascunho não publicado posteriormente por Joaquín) foi adicionar o is_transparenttipo como o protocolo que pode ser usado para optar pela nova funcionalidade.
Se você não usar um "functor transparente" (ou seja, um que defina um is_transparenttipo), os contêineres se comportam da mesma forma que sempre, e esse ainda é o padrão.
Se você escolher usar std::less<>(o que é novo para C ++ 14) ou outro tipo de "functor transparente", obterá a nova funcionalidade.
Usar std::less<>é fácil com modelos de alias:
template<typename T, typename Cmp = std::less<>, typename Alloc = std::allocator<T>>
using set = std::set<T, Cmp, Alloc>;
O nome is_transparentvem do N3421 da STL que adicionou os "operadores de diamante" ao C ++ 14. Um "functor transparente" é aquele que aceita qualquer tipo de argumento (que não precisa ser o mesmo) e simplesmente encaminha esses argumentos para outro operador. Tal functor passa a ser exatamente o que você deseja para pesquisa heterogênea em containers associativos, então o tipo is_transparentfoi adicionado a todos os operadores de diamante e usado como o tipo de tag para indicar que a nova funcionalidade deve ser habilitada em containers associativos. Tecnicamente, os contêineres não precisam de um "functor transparente", apenas um que suporte chamá-lo com tipos heterogêneos (por exemplo, o pointer_comptipo em https://stackoverflow.com/a/18940595/981959 não é transparente de acordo com a definição do STL,pointer_comp::is_transparentpermite que seja usado para resolver o problema). Se você apenas pesquisa em seu std::set<T, C>com chaves do tipo Tou intentão Csó precisa ser chamado com argumentos do tipo Te int(em qualquer ordem), não precisa ser verdadeiramente transparente. Usamos esse nome em parte porque não poderíamos encontrar um nome melhor (eu teria preferido is_polymorphicporque esses functores usam polimorfismo estático, mas já existe um std::is_polymorphictraço de tipo que se refere ao polimorfismo dinâmico).