Comparando iteradores de diferentes contêineres: um conto de advertência
Em C , os iteradores fornecem um mecanismo poderoso para percorrer coleções. No entanto, é importante estar ciente das limitações ao usar iteradores de contêineres diferentes.
A questão de saber se é legal comparar iteradores de contêineres diferentes surge frequentemente. Considere o seguinte exemplo:
std::vector foo;
std::vector bar;
std::cout Esta expressão pode parecer inofensiva à primeira vista, mas na verdade produz um comportamento indefinido. De acordo com o padrão C 11, os iteradores só podem ser comparados se se referirem a elementos da mesma sequência. Como foo e bar são dois vetores distintos seus iteradores não são comparáveis.
Esse comportamento é ainda mais enfatizado na edição nº 446 do LWG:
"O resultado da avaliação direta ou indireta de qualquer função de comparação ou o operador binário - com dois valores de iterador como argumentos que foram obtidos de dois intervalos diferentes r1 e r2 (...) que não são subintervalos de um intervalo comum é indefinido, a menos que explicitamente descrito de outra forma."
Esta restrição tem implicações significativas para a implementação de iteradores personalizados. Se você planeja implementar um operador== para seu iterador personalizado, você deve garantir que ele compare apenas iteradores que estão dentro do mesmo intervalo.
O não cumprimento desta regra pode levar a um comportamento inesperado e, em última análise, ser prejudicial à confiabilidade do seu código. Portanto, é crucial ter em mente que comparar iteradores de contêineres diferentes é estritamente proibido em C .
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3