c ++ 11 — краткий способ написать 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?

6

Решение

Очевидно …

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
}
20

Другие решения

Если вам нужен более сумасшедший поток управления в 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
});

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

3

Вдохновленный Havenard-х else 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, но, возможно, вы сделали — также у программистов на питоне, похоже, есть проблемы с этой функцией.


[1] К сожалению, нет краткая противоположность пуста в C ++ 😉

0
По вопросам рекламы [email protected]