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 find
etc. 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_transparent
tipo 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_transparent
tipo), 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_transparent
vem 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_transparent
foi 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_comp
tipo em https://stackoverflow.com/a/18940595/981959 não é transparente de acordo com a definição do STL,pointer_comp::is_transparent
permite que seja usado para resolver o problema). Se você apenas pesquisa em seu std::set<T, C>
com chaves do tipo T
ou int
então C
só precisa ser chamado com argumentos do tipo T
e 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_polymorphic
porque esses functores usam polimorfismo estático, mas já existe um std::is_polymorphic
traço de tipo que se refere ao polimorfismo dinâmico).