Диапазон для циклов, авто, кортежей и структурированных привязок [дубликат]

Выполнение скрипта apc.php является ключом к пониманию вашей проблемы, IMO. Это помогло нам правильно настроить кеш и на данный момент, похоже, решило проблему.

7
задан IceFire 18 September 2017 в 14:11
поделиться

2 ответа

Просто укажите первый элемент - это пара. Остальное будет выведено автоматически:

for(auto& pair : {std::pair<int,int>{1,2}, {3,4}})
  ;

Исчерпанный замкнутый инициализатор выводится как std::initalizer_list, а первый элемент, называемый парой, потребует всех элементов, которые будут Инитализатор для пары.

Вы отметили C ++ 11, но для полноты он может быть еще короче в C ++ 17:

for(auto& pair : {std::pair{1,2}, {3,4}})
  ;

Из-за аргумента шаблона шаблона вычет. Если вы этого не сделаете, то std::make_pair будет делать, если вы хотите сохранить преимущества вывода аргумента шаблона:

for(auto& pair : {std::make_pair(1,2), {3,4}})
  ;

Хотя якобы это не так полезно для игры в гольф, как Версия C ++ 17.

10
ответ дан StoryTeller 15 August 2018 в 16:01
поделиться
  • 1
    Хороший, спасибо :) Основываясь на вашем ответе, я также нашел эту версию, которая работает ниже C ++ 17: for(auto pair : {std::make_pair(1,2),{3,4},{5,6}}) – IceFire 18 September 2017 в 14:22
  • 2
    @IceFire - Да, он работает и на C ++ 11. Однако вывод аргумента может заменить make_pair на C ++ 17. – StoryTeller 18 September 2017 в 14:23
  • 3
    Да, мне нравится это лучше всего. Тем не менее, мой компилятор этого не принимает. В любом случае, похоже, мы рассмотрели все варианты – IceFire 18 September 2017 в 14:26
  • 4
    Можете ли вы отредактировать make_pair в ответе? – Yakk - Adam Nevraumont 18 September 2017 в 14:43
  • 5
    Хотите ли вы захватить пары по ссылке вместо значения? На большинстве платформ не должно быть двух целых чисел и указателя на 8 байтов, но ints - один из меньших уровней косвенности? Наверное, я надеюсь, что оба генерируют одну и ту же сборку после запуска оптимизатора ... – RyanP 18 September 2017 в 20:54

Хороший псевдоним типа ol:

using pairlist = std::initializer_list<std::pair<int,int>>;

for(auto pair : pairlist{{1,2}, {3,4}})
{
    // stuff happens here
}
1
ответ дан Galik 15 August 2018 в 16:01
поделиться
  • 1
    это на самом деле дольше – IceFire 18 September 2017 в 14:23
  • 2
    @IceFire В среднем не более одного цикла. – Galik 18 September 2017 в 14:27
  • 3
    Я ничего не сказал о нескольких циклах. На самом деле, желание разместить этот список inline является ясным индикатором, что у меня есть только один экземпляр цикла – IceFire 18 September 2017 в 14:28
  • 4
    @IceFire Задавая этот вопрос здесь, тем не менее, создал больше типизации, чем любое возможное сокращение в источнике. Так что беспокоиться о том, чтобы задать этот вопрос, является явным индикатором того, что существует более одного экземпляра цикла. – Yakk - Adam Nevraumont 18 September 2017 в 14:44
  • 5
    @IceFire. Но ваш вопрос относится к будущим читателям, и их конкретные потребности могут отличаться от ваших. – Galik 18 September 2017 в 15:13
Другие вопросы по тегам:

Похожие вопросы: