Объясните код?

Вы можете попробовать:

header_data = data[1][0][1].decode('utf-8')
-2
задан genpfault 13 July 2018 в 17:16
поделиться

2 ответа

std::bind2nd - старая функция привязки значения ко второму параметру функции. Он был заменен на std::bind и lambdas.

std::bind2nd возвращает вызываемый объект, который принимает один параметр, и вызывает завернутый вызов с этим параметром в качестве его первого параметра, а связанный параметр в качестве второго параметра:

int foo(int a, int b)
{
    std::cout << a << ' ' << b;
}

int main()
{
    auto bound = std::bind2nd(foo, 42);
    bound(10); // prints "10 42"
}

std::bind2nd (и его партнер std::bind1st) устарели в C ++ 11 и удалены на C ++ 17. Они были заменены на C ++ 11 более гибкими std::bind, а также лямбда-выражениями:

int foo(int a, int b)
{
    std::cout << a << ' ' << b;
}

int main()
{
    auto bound = std::bind(foo, std::placeholders::_1, 42);
    bound(10); // prints "10 42", just like the std::bind2nd example above

    auto lambda = [](int a) { foo(a, 42); };
    lambda(10); // prints "10 42", same as the other examples
}

std::transform вызывает вызов для каждого элемента диапазона и сохраняет результат вызова в выходной диапазон.

int doubleIt(int i)
{
    return i * 2;
}

int main()
{
    int numbers[] = { 1, 2, 3 };
    int doubled[3];

    std::transform(numbers, numbers + 3, doubled, doubleIt);
    // doubled now contains { 2, 4, 6 }
}
5
ответ дан Miles Budnek 17 August 2018 в 12:22
поделиться

std::bind2nd из C ++ 98/03 (в частности, pre-lambdas).

bin2nd(f, x) предполагает, что f является функцией (или, по крайней мере, чем-то, что можно вызвать, например функция) и x - это значение, которое передается этой функции в качестве второго параметра. Он создает что-то, что действует как функция. Когда вы вызываете функцию, которую она создает, она эквивалентна вызову f(something, x), поэтому binds x второму параметру его входной функции.

В настоящее время вы, вероятно, скорее всего напишите:

transform(std::begin(numbers), std::end(numbers), 
          remainders, 
          [](int x) { return x % 2; });

Что касается трансформации, это в значительной степени похоже на цикл, поэтому это примерно эквивалентно:

for (int i=0; i<3; i++)
    remainders[i] = numbers[i] % 2;

В целом, я думаю, что исходный код наполовину -baked. Мне кажется, что это, вероятно, было написано, когда все это было довольно новым (или, по крайней мере, новым для автора). Если бы я собирался выполнить эту работу в целом, я бы, вероятно, немного «сбил» операции:

std::transform(std::begin(numbers), std::end(numbers),
            std::ostream_iterator<std::string>(std::cout, "\n"), 
            [](int i) { return std::to_string(i) + (i % 2 == 0 ? " is even" : " is odd"); });

Оригинал, похоже, не используется для массива remainders, кроме чтобы сохранить промежуточное значение перед печатью результата, поэтому, вероятно, лучше вообще не создавать / заполнять его.

3
ответ дан Jerry Coffin 17 August 2018 в 12:22
поделиться
Другие вопросы по тегам:

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