Здравствуйте, rg45, Вы писали:
M>>ЗЫ Кстати, а зачем буст?
R>Затем, что в той версии gcc, что в ideone, этих функций просто еще нету. Требование "чтоб без буста" ты ведь позже ввел.
Ну, вообще я интересовался языковыми средствами C++ из новых стандартов, и думал, что, возможно, предусмотрено какое-то языковое средство для определения крайних случаев.
M>>Чем плох такой вариант:
R>Да ни чем не хуже. Только зачем ты этот топик создавал, если вариант обычного for тебя тоже устраивает, оказывается
Да если столько писанины в итоге, то уже как-то и не важно, в каком виде этот несчастный for будет
M>>Да если столько писанины в итоге, то уже как-то и не важно, в каком виде этот несчастный for будет
R>Ну смотри, я тут походу пьессы уже предоставил два варианта — один максимально универсальный
Здравствуйте, rg45, Вы писали:
R>>>Да не вопрос, давай упростим, но только оба варианта!
M>>Нормас!
R>Не, ты скажи, что я тебя убедил
Неа
1) Таки буст.
2) Таки то, что с пустым вектором не работает. Это таки критичнее, чем то, что мой вариант не работает с произвольным контейнеромадаптером
Здравствуйте, Marty, Вы писали:
M>2) Таки то, что с пустым вектором не работает. Это таки критичнее, чем то, что мой вариант не работает с произвольным контейнеромадаптером
Ай, блин, я ждал, что ты это скажешь!
Лады, замечание справедливое, подчиняюсь.
if (!cont.empty())
{
std::cout << cont.front();
for (auto& a : boost::make_iterator_range(cont, 1, 0))
std::cout << ", " << a;
}
for (auto& a : cont)
{
if (&a != &cont.front())
std::cout << ", ";
std::cout << item;
}
По компактности соизмеримо. По надежности, и универсальности мой вариант лучше, ты вроде бы признаешь это. Но вот по читабельности мне мой вариант нравится больше: сразу видно, что первый элемент обрабатывается иначе, чем хвост — логика программы легче отслеживается.
Ну вот только буст остается. Но я лично против буста ничего не имею.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
M>>2) Таки то, что с пустым вектором не работает. Это таки критичнее, чем то, что мой вариант не работает с произвольным контейнеромадаптером
R>Ай, блин, я ждал, что ты это скажешь!
На самом деле, сначала не очень хотелось занудствовать, но я опасался обвинений в вопиющем непрофессионализме, и решил таки показать, что немного таки разбираюсь в уровнях допустимости тех или иных решений, хоть возможно и не слишком хорошо
R>По компактности соизмеримо. По надежности, и универсальности мой вариант лучше, ты вроде бы признаешь это.
Согласен.
R>Но вот по читабельности мне мой вариант нравится больше: сразу видно, что первый элемент обрабатывается иначе, чем хвост — логика программы легче отслеживается.
Имхо — вкусовщина и дело привычки
R>Ну вот только буст остается. Но я лично против буста ничего не имею.
По возможности избегаю. Сейчас вообще продакшн код пишу для STMки, а там у кейла такая ситуёвина, что компилятор вроде допилили до 11го стандарта, а библиотеки — забыли, поленились, или бабла на это зажали. Это вроде даже не кейловская проблема, а армовская. Буст втуда вкорячивать не вижу особого смысла
С другой стороны, иногда пишу всякие утилитки для локального вспоможения на MSVC, C++17, а код, по возможности, для одних и тех же случаев стараюсь переиспользовать и там и там. Более новые стандарты пробую использовать только там, что в STMку точно не пролезет. А с нынешним достаточно резвым темпом принятия фич в стандарт буст таскать ради пары мелочей смысла не вижу
Здравствуйте, B0FEE664, Вы писали:
M>>Для нового range-for'а есть какой-нибудь вариант? BFE>Есть вот такой модный вариант, но он не то, что вы просите: BFE>
BFE> if ( auto it = std::begin(v), itEnd = std::end(v); itEnd != it )
BFE> {
BFE> std::cout << *it;
BFE> for(++it; itEnd != it; ++it)
BFE> {
BFE> std::cout << ", " << *it;
BFE> }
BFE> }
BFE>
Вот эта многоэтажность в условии глаз не радует совершенно. Зачем вообще здесь что-то выдумывать, когда все предельно просто:
if (!std::empty(v))
{
std::cout << std::front(v);
for(auto it = std::begin(v) + 1; it != std::end(v); ++it)
{
std::cout << ", " << *it;
}
}
Ну правда std::empty и std::front появляются только в С++17. Но их отсутствие легко восполняется, могу показать, если нужно.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Вот эта многоэтажность в условии глаз не радует совершенно.
Я пробовал так:
if ( auto [it, itEnd] = {std::begin(v), std::end(v)}; itEnd != it )
но не собралось.
R>Зачем вообще здесь что-то выдумывать, когда все предельно просто:
Затем, чтобы избежать вызова std::end(v) на каждую проверку условия цикла.
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, rg45, Вы писали:
R>>Вот эта многоэтажность в условии глаз не радует совершенно. BFE>Я пробовал так: BFE>
BFE>if ( auto [it, itEnd] = {std::begin(v), std::end(v)}; itEnd != it )
BFE>
Здравствуйте, B0FEE664, Вы писали:
R>>Зачем вообще здесь что-то выдумывать, когда все предельно просто: BFE>Затем, чтобы избежать вызова std::end(v) на каждую проверку условия цикла.
Меня тут давеча в преждевременной оптимизации упрекали. Так вот это оно самое. Ты наворачиваешь код, борясь с вымышленным импактом.
Не будет там никакого ВЫЗОВА — в подавляющем-подавляющем большинстве случаев. А тех редких случаях, когда будет вызов — не факт, что именно он окажется узким горлышком. Ну и наконец, если при каком-то невероятнейшем раскладе это случится, то оптимизация будет тривиальной. Я только не понимаю, зачем нам сейчас рассматривать эту экзотику, хогда разговор на уровне "что такое хорошо и что такое плохо".
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, B0FEE664, Вы писали:
BFE>Дело не в этом. BFE>Вот такая конструкция не работает: BFE>
BFE> int i1 = 1;
BFE> int i2 = 2;
BFE> auto [a, b] = std::tuple{i1, i2};
BFE>
BFE>А жаль.
Ибо потому что через тупл надо, потому что тут присваивание, а значит {} описывает initializer_list вместо конструктора. Были бы разные типу у it и i2, то даже до этого не дошел бы.
Здравствуйте, rg45, Вы писали:
BFE>>Затем, чтобы избежать вызова std::end(v) на каждую проверку условия цикла. R>Меня тут давеча в преждевременной оптимизации упрекали.
Это был не я.
R>Так вот это оно самое.
Да неужели? А писать ++it вместо it++ — тоже преждевременная оптимизация?