Por questões de legibilidade, evito o uso de std::pair para código complexo para manter os nomes das variáveis significativos.
Levando em consideração que std::equal_range retorna o std::pair
número de iteradores, é eficaz e seguro usar ligação estruturada para descompactar os iteradores desta forma:
Em vez de
auto it_lower = std::lower_bound(my_array.begin(), my_array.end(), val, comparator);
auto it_upper = std::upper_bound(my_array.begin(), my_array.end(), val, comparator);
usar
auto [it_lower, it_upper] = std::equal_range(my_array.begin(), my_array.end(), val, comparator);
abordagem?
Esquecendo-se de possíveis implementações diferentes de equal_range
e lower_bound
/ upper_bound
par (desempenho diferente, etc.) e focando apenas no uso de pacotes estruturados, isso é igual tanto em termos de representação no código compilado quanto em desempenho? Não estou perguntando o que o compilador fará. Minha pergunta é apenas: se eu usar a ferramenta corretamente e posso esperar resultados semelhantes? Ou há alguma diferença ou, pior ainda, armadilhas?
Sinto falta de alguma coisa ou está perfeitamente bem?
Isto é perfeitamente seguro, eficaz e é a abordagem recomendada.
Em comparação com a pesquisa de toda a gama
lower_bound
eupper_bound
como você mostrou, também tem o potencial de ser mais eficaz.Para explicar a última afirmação, a sua busca pelo limite superior inclui o intervalo
[my_array.begin(), it_lower)
que, na maioria das circunstâncias, causará mais comparações do que o necessário.A busca pelo limite superior deve ser usada
it_lower
como primeiro iterador para excluir o intervalo já excluído porstd::lower_bound
: