std :: transform с использованием лямбда-выражения C ++ 0x

Вариант1. вы можете использовать AlertifyJS , это полезно для предупреждения

Option2. вы запускаете или просто присоединяетесь к проекту на основе web-приложений, дизайн интерфейса, возможно, хорош. В противном случае это должно быть изменено. Для приложений Web 2.0 вы будете работать с динамическим содержимым, множеством эффектов и другими материалами. Все это прекрасно, но никто не задумывался над тем, чтобы создать JavaScript-оповещение и подтвердить флажки. Вот как они

создают простое имя js-файла jsConfirmStyle.js. Вот простой js-код

ie5=(document.getElementById&&document.all&&document.styleSheets)?1:0;
nn6=(document.getElementById&&!document.all)?1:0;

xConfirmStart=800;
yConfirmStart=100;

if(ie5||nn6) {
if(ie5) cs=2,th=30;
else cs=0,th=20;
document.write(
    "
"+ ""+ ""+ ""+ ""+ "
"+ ""+ "  "+ ""+ "
"+ "
" ); } document.write("
"); function leftJsConfirm() { document.getElementById('jsconfirm').style.top=-1000; document.location.href=leftJsConfirmUri; } function rightJsConfirm() { document.getElementById('jsconfirm').style.top=-1000; document.location.href=rightJsConfirmUri; } function confirmAlternative() { if(confirm("Scipt requieres a better browser!")) document.location.href="http://www.mozilla.org"; } leftJsConfirmUri = ''; rightJsConfirmUri = ''; /** * Show the message/confirm box */ function showConfirm(confirmtitle,confirmcontent,confirmlefttext,confirmlefturi,confirmrighttext,confirmrighturi) { document.getElementById("jsconfirmtitle").innerHTML=confirmtitle; document.getElementById("jsconfirmcontent").innerHTML=confirmcontent; document.getElementById("jsconfirmleft").value=confirmlefttext; document.getElementById("jsconfirmright").value=confirmrighttext; leftJsConfirmUri=confirmlefturi; rightJsConfirmUri=confirmrighturi; xConfirm=xConfirmStart, yConfirm=yConfirmStart; if(ie5) { document.getElementById("jsconfirm").style.left='25%'; document.getElementById("jsconfirm").style.top='35%'; } else if(nn6) { document.getElementById("jsconfirm").style.top='25%'; document.getElementById("jsconfirm").style.left='35%'; } else confirmAlternative(); }

Создайте простой html-файл



jsConfirmSyle




   

 

JsConfirmStyled

standard

29
задан Community 23 May 2017 в 10:30
поделиться

6 ответов

std::transform(myv1.begin(), myv1.end(), myv1.begin(), 
   [](double d) -> double { return d * 3; });
34
ответ дан Steve Townsend 23 May 2017 в 10:30
поделиться

Просто сделайте, как говорит Дарио:

for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });

for_each разрешено изменять элементы, говоря, что это не может быть мифом.

28
ответ дан GManNickG 23 May 2017 в 10:30
поделиться

Используя изменяемый подход, мы можем использовать for_each для непосредственного обновления элементов последовательности посредством ссылок.

for_each(begin(myv1), end(myv1), [](double& a) { a *= 3; });


В настоящее время идут дебаты о том, разрешено ли for_each модифицировать элементы, как это называется «неизменяющим» алгоритмом.

Это означает, что for_each не разрешается изменять последовательность , на которой он работает (что относится к изменениям структуры последовательности - то есть делает недействительными итераторы). Это не означает, что мы не можем модифицировать неконстантные элементы вектора как обычно - сама структура не затрагивается этими операциями.

8
ответ дан Dario 23 May 2017 в 10:30
поделиться

Вот так:

vector<double> myv1;
transform(myv1.begin(), myv1.end(), myv1.begin(), [](double v)
{
    return v*3.0;
});
5
ответ дан John Dibling 23 May 2017 в 10:30
поделиться

Основной первоначальной мотивацией для использования этого функционального стиля для этих случаев в C ++ было «aaagh! Iterator loops!», А C ++ 0x удаляет эту мотивацию с помощью оператора for, основанного на диапазоне. Я знаю, что часть вопроса заключалась в том, чтобы выяснить синтаксис лямбды, но я думаю, что ответ на вопрос «Как это делается в C ++ 0x?» is:

for(double &a : myv1) { a *= 3; }

Там нет реального функционального объекта, но если это поможет, вы можете притвориться, что { a *= 3; } - это очень сокращенная лямбда. Что касается удобства использования, то в любом случае это равносильно тому же, хотя проект стандарта определяет диапазон на основе эквивалентного цикла for.

28
ответ дан Steve Jessop 23 May 2017 в 10:30
поделиться

Я использую VS2012, который поддерживает адаптер привязки C ++ 11. Чтобы связать первый элемент двоичной функции (как это делает использование bind1st), вам нужно добавить _1 (аргумент-заполнитель). Нужно включить функционал для привязки.

using namespace std::placeholders;
std::transform( myv1.begin(), myv1.end(), myv1.begin(),
                 std::bind( std::multiplies<double>(),3,_1));
1
ответ дан Elligno 23 May 2017 в 10:30
поделиться
Другие вопросы по тегам:

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