c++ merge学习问题

请问如何利用运算符重载完成merge

#include<iostream>
using namespace std;

#include<vector>
#include<algorithm>
#include<string>
#include<ctime>
#include<functional>



class Person
{
public:
    Person()
    {
        
    }
    
    Person(string name, int age);
    ~Person();

    bool operator<(const Person& p)
    {
        if (this->m_Age < p.m_Age)
        {
            return 1;
        }
        else
            return 0;
    }

private:
    string m_Name;
    int m_Age;

    friend void test02();
    friend class MyPrint;
    friend class MyCompareUP;
    friend class MyCompareDown;
};

Person::Person(string name, int age)
{
    this->m_Name = name;
    this->m_Age = age;
}

Person::~Person()
{

}

class MyCompareUP
{
public:
    bool operator()(const Person& p1, const Person& p2)
    {
        return p1.m_Age < p2.m_Age;
    }
};

class MyCompareDown
{
public:
    bool operator()(const Person& p1, const Person& p2)
    {
        return p1.m_Age > p2.m_Age;
    }
};

class MyPrint
{
public:
    void operator()(const Person& p)
    {
        cout << "姓名" << p.m_Name << "年龄" << p.m_Age << endl;
    }
};

void myPrint(int c)
{
    cout << c << " ";
}

void test01()
{
    vector<int>v,v2,v3;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
        v2.push_back(i+1);
    }

    

    cout << "升序合并" << endl;
//    sort(v.begin(), v.end());
//    sort(v2.begin(), v2.end());
    v3.resize(v.size() + v2.size());
    merge(v.begin(), v.end(), v2.begin(), v2.end(), v3.begin());
    for_each(v3.begin(), v3.end(), myPrint); cout << endl;
    v3.clear();

    cout << "降序合并" << endl;
    sort(v.begin(), v.end(),greater<int>());
    sort(v2.begin(), v2.end(),greater<int>());
    v3.resize(v.size() + v2.size());
    merge(v.begin(), v.end(), v2.begin(), v2.end(), v3.begin(),greater<int>());
    for_each(v3.begin(), v3.end(), myPrint); cout << endl;
    v3.clear();
}

void test02()
{
    vector<Person>v,v2,v3;
    char nameSeed[3][2] = { "A","B","C" };
    srand((unsigned int)time(NULL));

    for (int i = 0; i < 3; i++)
    {
        int age = rand() % 100 + 1;
        v.push_back(Person((const char*)nameSeed[i], age));
    }

    
    Person pp("C", 0);
    v2.push_back(pp);
    


    cout << "升序合并" << endl;
    sort(v.begin(), v.end(),MyCompareUP());
    sort(v2.begin(), v2.end(),MyCompareUP());
    v3.resize(v.size() + v2.size());
    merge(v.begin(), v.end(), v2.begin(), v2.end(), v3.begin(),[](const Person& p1,const Person& p2){return p1<p2;});
    for_each(v3.begin(), v3.end(), MyPrint()); cout << endl;
    v3.clear();

    cout << "降序合并" << endl;
    sort(v.begin(), v.end(),MyCompareDown());
    sort(v2.begin(), v2.end(),MyCompareDown());
    v3.resize(v.size() + v2.size());
    merge(v.begin(), v.end(), v2.begin(), v2.end(), v3.begin(), [](const Person& p1,const Person& p2){return p1>p2;});
    for_each(v3.begin(), v3.end(), MyPrint()); cout << endl;
    v3.clear();

}



int main()
{
        test01();cout<<endl<<endl;
        test02();cout<<endl<<endl;


}

Person 类 你还少一个 > 的重载,另外 < 的重载也可以简写一下

    bool operator<(const Person& p) const
    {
        return this->m_Age < p.m_Age;
    }

    bool operator>(const Person& p) const
    {
        return this->m_Age > p.m_Age;
    }

img

  • 这篇博客也许可以解决你的问题👉 :C++ merge()和inplace_merge()函数用法详解(深入了解,一文学会)
  • 除此之外, 这篇博客: C++ 提高编程中的 3.3 merge 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 功能描述:

    • 两个容器元素合并,并存储到另一个容器中

    函数原型

    merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
    

    注意:

    • 两个容器必须是有序的
    • 要提前给目标容器分配空间

    参数:

    • beg1:容器1开始迭代器
    • end1:容器1结束迭代器
    • beg2:容器2开始迭代器
    • end2:容器2结束迭代器
    • dest:目标容器开始迭代器
  • 以下回答由chatgpt基于相关博客总结生成:

    在C++中完成merge操作可以使用运算符重载来实现。以下是一种可能的操作方法:

    1. 首先,定义一个类或结构体来表示要合并的数据。该类或结构体应包含要合并的数据和相关的运算符重载函数。
    class MergeData {
    public:
        int data;
    
        MergeData(int value) : data(value) {}
    
        bool operator<(const MergeData& other) const {
            return data < other.data;
        }
    };
    
    1. 然后,使用上述类或结构体作为容器元素的类型创建两个有序容器(例如vector)并填充数据。
    std::vector<MergeData> container1;
    std::vector<MergeData> container2;
    
    // 假设这里已经填充了container1和container2
    // container1和container2在插入元素时应该保持有序
    
    1. 最后,使用std::merge函数完成合并操作,并将结果存储到目标容器中。
    std::vector<MergeData> result(container1.size() + container2.size());
    std::merge(container1.begin(), container1.end(), container2.begin(), container2.end(), result.begin());
    

    完整的代码示例:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    class MergeData {
    public:
        int data;
    
        MergeData(int value) : data(value) {}
    
        bool operator<(const MergeData& other) const {
            return data < other.data;
        }
    };
    
    int main() {
        std::vector<MergeData> container1;
        std::vector<MergeData> container2;
    
        // 假设这里已经填充了container1和container2
        // container1和container2在插入元素时应该保持有序
    
        std::vector<MergeData> result(container1.size() + container2.size());
        std::merge(container1.begin(), container1.end(), container2.begin(), container2.end(), result.begin());
    
        // 打印合并后的结果
        for (const MergeData& data : result) {
            std::cout << data.data << " ";
        }
    
        return 0;
    }
    

    以上代码使用了类的方法来完成merge操作,通过给类添加运算符重载函数,可以实现类对象之间的比较和排序。根据你的需求,你可以根据具体的情况选择使用自定义的类或结构体来表示要合并的数据,并相应地实现运算符重载函数。