std::transform และ std::plus ทำงานร่วมกันอย่างไร

ฉันกำลังอ่านการอ้างอิง C++ และเจอฟังก์ชัน std::plus พร้อมตัวอย่าง ซึ่งค่อนข้างตรงไปตรงมา เพียงเพิ่ม lhs และ rhs รหัสคือ:

#include <functional>
#include <iostream>

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

เอาท์พุต: สวัสดีชาวโลก

ฉันเปลี่ยนมันเป็น

#include <functional>
#include <iostream>

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

เอาท์พุต : 6

ตอนนี้ฉันทำ

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

ฉันโทรไป:

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

และมันให้ 21 41 61 81 101 ซึ่งฉันเข้าใจว่ามันรวมทั้ง foo และ bar แต่มันถูกส่งผ่านไปยัง std::plus function ได้อย่างไร


person mlhazan    schedule 23.02.2016    source แหล่งที่มา
comment
สิ่งนี้ไม่ตอบคำถามของคุณใช่ไหม ฉันเดาว่าคุณคงจะได้ดูมันแล้ว ไม่เช่นนั้น คุณจะไม่รู้ว่าจะโทรหา std::transform ได้อย่างไร en.cppreference.com/w/cpp/algorithm/transform   -  person 5gon12eder    schedule 23.02.2016


คำตอบ (2)


std::plus<> คือ functor ซึ่งเป็นเพียงการพูดคุยที่หรูหราสำหรับคลาสที่ใช้ operator() นี่คือตัวอย่าง:

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

std::transform ที่คุณมีนั้นเทียบเท่ากับ:

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;
}

ในที่นี้ binary_op คือชื่อที่ตั้งให้กับ std::plus<> เนื่องจาก std::plus<> เป็นฟังก์ชัน ดังนั้น C++ จึงตีความการ "เรียก" ว่าเป็นการเรียกฟังก์ชัน operator() ซึ่งจะทำให้เรามีพฤติกรรมที่ต้องการ

person Brian Rodriguez    schedule 23.02.2016
comment
เป็นตัวอย่างเพื่อวัตถุประสงค์ในการสาธิตไม่ใช่การส่งเพื่อรวมเข้าในมาตรฐาน - person Kurt Stutsman; 23.02.2016
comment
คุณหมายถึงอะไร โดยปกติ สิ่งนี้จะล้มเหลวในเวลารวบรวม - person M.M; 23.02.2016
comment
@M.M หากไม่ใช่ functor/หากไม่ได้ใช้งาน operator() - person Brian Rodriguez; 23.02.2016

std::plus หนึ่งในชุดฟังก์ชันที่จัดทำโดย STL หากคุณคุ้นเคยกับการเขียนโปรแกรมเชิงฟังก์ชัน สิ่งเหล่านี้จะอำนวยความสะดวกให้กับการจัดองค์ประกอบของฟังก์ชัน std::plus เป็นตัวดำเนินการไบนารีโดยเฉพาะ ดังนั้นจึงต้องใช้สองอาร์กิวเมนต์ std::Transform จะส่งองค์ประกอบจากเวกเตอร์ทั้งสองไปให้มัน คุณยังสามารถใช้ std::bind เพื่อเปลี่ยนตัวดำเนินการไบนารี่ให้เป็นตัวดำเนินการอาร์กิวเมนต์เดียว โดยทั่วไปจะผูกค่าคงที่กับอาร์กิวเมนต์ที่สอง

โดยส่วนตัวแล้วฉันคิดว่า std::plus และสิ่งที่คล้ายคลึงกันนั้นมีประโยชน์มากกว่าก่อนการถือกำเนิดของ c++11 ฟังก์ชันแลมบ์ดา Lambda ช่วยให้คุณสามารถกำหนดชุดการดำเนินการเพื่อดำเนินการกับข้อมูลของคุณ โดยไม่ต้องจัดการกับการผูกหรือ std::plus และลักษณะเดียวกัน

person Atifm    schedule 23.02.2016