В некотором коде, над которым я работал, у меня есть цикл 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?
Очевидно …
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-х 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 ++ 😉