Bagaimana std::transform dan std::plus bekerja sama?

Saya sedang membaca referensi C++ dan menemukan fungsi std::plus dengan sebuah contoh. Yang cukup mudah, cukup menambahkan lhs dan rhs. Kodenya adalah:

#include <functional>
#include <iostream>

int main()
{
   std::string a = "Hello ";
   const char* b = "world";
   std::cout << std::plus<>{}(a, b) << '\n';
}

keluaran: Halo dunia

Saya mengubahnya menjadi

#include <functional>
#include <iostream>

int main()
{
   int a = 5;
   int b = 1;
   std::cout << std::plus<int>{}(a, b) << '\n';
}

keluaran : 6

Sekarang saya membuat

foo vector = 10 20 30 40 50
bar vector = 11 21 31 41 51

Aku dihubungi:

std::transform (foo.begin(), foo.end(), bar.begin(), foo.begin(), std::plus<int>());

dan itu memberi 21 41 61 81 101 yang menurut saya itu menambahkan foo dan bar. Tapi bagaimana cara meneruskannya ke fungsi std::plus?


person mlhazan    schedule 23.02.2016    source sumber
comment
Apakah ini tidak menjawab pertanyaan Anda? Saya kira Anda pasti sudah melihatnya atau Anda tidak akan tahu cara menelepon std::transform. en.cppreference.com/w/cpp/algorithm/transform   -  person 5gon12eder    schedule 23.02.2016


Jawaban (2)


std::plus<> adalah functor, yang hanya merupakan pembicaraan mewah untuk kelas yang mengimplementasikan operator(). Berikut ini contohnya:

struct plus {
    template <typename A, typename B>
    auto operator()(const A& a, const B& b) const { return a + b; }
};

std::transform yang Anda miliki kira-kira setara dengan:

template<typename InputIt1, typename InputIt2, 
         typename OutputIt, typename BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, 
                   OutputIt d_first, BinaryOperation binary_op)
{
    while (first1 != last1) {
        *d_first++ = binary_op(*first1++, *first2++);
    }
    return d_first;
}

Di sini, binary_op adalah nama yang diberikan kepada std::plus<>. Karena std::plus<> adalah sebuah functor, C++ akan menafsirkan "panggilan" padanya sebagai panggilan ke fungsi operator(), sehingga memberikan kita perilaku yang kita inginkan.

person Brian Rodriguez    schedule 23.02.2016
comment
Ini adalah contoh untuk tujuan demonstrasi, bukan sebagai pengajuan untuk dimasukkan ke dalam standar. - person Kurt Stutsman; 23.02.2016
comment
Apa yang Anda maksud dengan Biasanya, ini akan gagal pada waktu kompilasi - person M.M; 23.02.2016
comment
@M.M Jika itu bukan fungsi/jika tidak diimplementasikan operator(). - person Brian Rodriguez; 23.02.2016

std::plus salah satu dari serangkaian fungsi yang disediakan oleh STL. Jika Anda familiar dengan pemrograman fungsional, mereka akan memudahkan komposisi fungsi. std::plus secara khusus adalah operator biner, sehingga dibutuhkan dua argumen. std::Transform akan mengirimkan elemen dari dua vektor. Anda juga dapat menggunakan std::bind untuk mengubah operator biner menjadi operator satu argumen, yang pada dasarnya mengikat sebuah konstanta ke argumen kedua.

Secara pribadi saya pikir std::plus dan sejenisnya lebih berguna sebelum munculnya c++11 fungsi lambda. Lambda memungkinkan Anda menentukan serangkaian operasi yang akan dilakukan pada data Anda tanpa harus berurusan dengan pengikatan atau std::plus dan sejenisnya.

person Atifm    schedule 23.02.2016