Estou olhando cppreference mas não vejo nenhuma informação sobre a ordem do loop executado.
Minha pergunta : ao ligar, std::ranges::any_of
tenho data.begin(), data.end()
certeza de que vai de begin()
para end()
em ordem e para uma vez true
?
Estou olhando cppreference mas não vejo nenhuma informação sobre a ordem do loop executado.
Minha pergunta : ao ligar, std::ranges::any_of
tenho data.begin(), data.end()
certeza de que vai de begin()
para end()
em ordem e para uma vez true
?
Não, não existe essa garantia.
De acordo com a complexidade declarada para std::ranges::any_of :
A implementação é livre para iterar em uma ordem diferente daquela que você mencionou (por exemplo, na ordem inversa). Também não é obrigatório parar nos primeiros elementos para os quais o predicado é verdadeiro. A única garantia é que usará o predicado/projeção em cada elemento no máximo 1 vez.
Dito isto, o que você mencionou é uma expectativa muito razoável de qualquer implementação "normal", e presumo que todos eles a seguirão (embora, como eu disse, não seja obrigatório).
A rigor, a norma não especifica.
No entanto, de acordo com o padrão C++,
[alg.any.of]
any_of
é definido como:[algorithms.requirements]/4.1
diz:E
[tab:inputiterator]
(de ) tem apenas os[input.iterators]
requisitos dea != b
,,,,,, e*a
a->m
++r
(void)r++
*r++
Assim, como o único requisito nos iteradores (em termos de travessia) é
++r
orr++
, é lógico supor que a função irá defirst
paralast
em ordem.