Есть ли эквивалент цикла «for … else» Python в C ++?

У Python есть интересный оператор, который позволяет указать условие else .

В конструкции, подобной этой:

 for i in foo: if bar(i): break else: baz() 

предложение else выполняется после for , но только если for завершает нормально (не break ).

Я задавался вопросом, был ли эквивалент в C ++? Могу ли я использовать for ... else ?

5 Solutions collect form web for “Есть ли эквивалент цикла «for … else» Python в C ++?”

Более простой способ выразить свою фактическую логику – это std::none_of :

 if (std::none_of(std::begin(foo), std::end(foo), bar)) baz(); 

Если предложение диапазона для C ++ 17 принимается, мы надеемся, это упростит:

 if (std::none_of(foo, bar)) baz(); 

Если не против использования goto также можно сделать следующим образом. Это экономит от дополнительных, if проверка и более широкое объявление переменной видимости.

 for(int i = 0; i < foo; i++) if(bar(i)) goto m_label; baz(); m_label: ... 

Да, вы можете добиться такого же эффекта:

 auto it = std::begin(foo); for (; it != std::end(foo); ++it) if(bar(*it)) break; if(it == std::end(foo)) baz(); 

Это моя грубая реализация в C ++:

 bool other = true; for (int i = 0; i > foo; i++) { if (bar[i] == 7) { other = false; break; } } if(other) baz(); 

Для этого вы можете использовать функцию лямбда:

 [&](){ for (auto i : foo) { if (bar(i)) { // early return, to skip the "else:" section. return; } } // foo is exhausted, with no item satisfying bar(). ie, "else:" baz(); }(); 

Это должно вести себя точно так же, как Python «for..else», и оно имеет некоторые преимущества перед другими решениями:

  • Это настоящая замена для «for..else»: раздел «for» может иметь побочные эффекты (в отличие от none_of, предикат которого не должен изменять свой аргумент), и он имеет доступ к внешней области.
  • Это более читаемо, чем определение специального макроса.
  • Он не требует каких-либо специальных переменных флага.

Но … я бы использовал неуклюжую флаговую переменную.

Python - лучший язык программирования в мире.