2017-02-20 23 views
0

Может ли кто-нибудь предложить, как в C++ 11/14 элегантно итерировать постоянный набор (по-английски, а не значение C++) чисел, желательно, не оставляя временных объектов, таких как здесь:C++: изящно итератировать набор чисел

set<int> colors; 
colors.insert(0); 
colors.insert(2); 

for (auto color : colors) 
{ 
    //Do the work 
} 

? Надеюсь найти 1-лайнер.

Другими словами, есть волшебный способ сделать это выглядеть примерно так:

for (int color in [0,2])//reminds me of Turbo Pascal 
{ 
    //Do the work 
} 

или

for (auto color in set<int>(0,2))//Surely it cannot work this way as it is 
{ 
    //Do the work 
} 
+1

Что вы итерируете, это набор целых чисел. Это было бы равным или большим накладным расходами для итерации с использованием ссылок. У вас все хорошо. –

+0

О каком объекте вы говорите, когда говорите * временные объекты, как здесь *? –

+0

'для (auto const & color: colors)', например, действителен. –

ответ

3

Вы можете использовать std::initializer_list вместо std::set:

for (auto color : {2, 5, 7, 3}) { 
    // Magic 
} 

Th e заключенные скобки { ... } выведет std::initializer_list<int>, который будет истребителем.

1

Просто некоторые случайные мысли. Что-то вроде этого?

for(auto color : set<int>{0, 2}) { // do the work } 

Или, может быть, использовать функцию?

auto worker = [](int x) { // do the work }; 
worker(0); 
worker(2); 

Чтобы избежать временного объекта, возможно, использовать шаблонную функцию как

template<int N> 
void worker(params_list) { 
    // do the work 
} 

затем

worker<0>(params_list); 
worker<2>(params_list);