Краткий способ написать for/else в C++?

В некотором коде, над которым я работал, у меня есть цикл for, который перебирает карту:

for (auto it = map.begin(); it != map.end(); ++it) {

    //do stuff here
}

И мне было интересно, есть ли какой-нибудь способ кратко написать что-нибудь с эффектом:

for (auto it = map.begin(); it != map.end(); ++it) {
    //do stuff here
} else {
    //Do something here since it was already equal to map.end()
}

Я знаю, что я мог бы переписать как:

auto it = map.begin();
if (it != map.end(){

    while ( it != map.end() ){
        //do stuff here
        ++it;
    }

} else {
    //stuff
}

Но есть ли лучший способ, который не включает в себя выражение if?

3 ответа

Решение

Очевидно...

if (map.empty())
{
    // do stuff if map is empty
}
else for (auto it = map.begin(); it != map.end(); ++it)
{
    // do iteration on stuff if it is not
}

Кстати, поскольку здесь мы говорим о C++11, вы можете использовать этот синтаксис:

if (map.empty())
{
    // do stuff if map is empty
}
else for (auto it : map)
{
    // do iteration on stuff if it is not
}

Если вам нужен более сумасшедший поток управления в C++, вы можете написать его в C++11:

template<class R>bool empty(R const& r)
{
  using std::begin; using std::end;
  return begin(r)==end(r);
}
template<class Container, class Body, class Else>
void for_else( Container&& c, Body&& b, Else&& e ) {
  if (empty(c)) std::forward<Else>(e)();
  else for ( auto&& i : std::forward<Container>(c) )
    b(std::forward<decltype(i)>(i));
}

for_else( map, [&](auto&& i) {
  // loop body
}, [&]{
  // else body
});

но я бы посоветовал против этого.

Вдохновленный Havenard'selse forЯ попробовал эту структуру с остальной частью, сидящей в правильном месте [1].

if (!items.empty()) for (auto i: items) {
    cout << i << endl;
} else {
    cout << "else" << endl;
}

( полное демо)

Я не уверен, буду ли я использовать его в реальном коде, также потому, что я не помню ни одного случая, когда я пропускал else пункт для for цикл, но я должен признать, что только сегодня я узнал, что Python имеет его. Я прочитал из вашего комментария

//Do something here since it was already equal to map.end()

... что вы, вероятно, не имеете в виду питонаfor-else, но, возможно, вы это сделали - у программистов на python, похоже, есть проблемы с этой функцией.


[1] к сожалению, нет четкой противоположности пустому в C++;-)

Другие вопросы по тегам