簡體   English   中英

C ++中兩個指針向量的相減和相交

[英]Subtraction and Intersection of two vectors of pointers in C++

我有兩個指向我的自定義類對象的指針。
這兩個向量中的指針沒有指向同一對象,但是存儲在這些對象中的值是相同的。

我的自定義類結構為:


Class Item
{
   string ItemId;
   string ItemDescription;
   float ItemPrice;
}
第一向量( V1 )具有n個條目,第二向量( V2 )具有m個條目(n> m)

我必須執行兩項操作:

  • 獲取在V1V2中都具有公共對象的向量。 通常,我的意思是說元素的ItemId是相同的。 (可以稱為V1和V2的交集 )。

  • 獲得一個向量,該向量具有V2中不存在的元素。 (可以稱為V1-V2 )。

    如何有效地做到這一點?

  • 這是如何使用STL set_intersection和set_difference獲得所需內容的示例:

    class Item
    {
    public:
        Item(int i):ItemId(i){}
    
       int ItemId;
       string ItemDescription;
       float ItemPrice;
    
       bool operator<(const Item& rhs)
       {
           return ItemId < rhs.ItemId;
       }
       bool operator==(const Item& rhs)
       {
           return ItemId == rhs.ItemId;
       }
    };
    
    int main()
    {
        std::vector<Item> myvec1;
        myvec1.push_back(Item(1));
        myvec1.push_back(Item(2));
        myvec1.push_back(Item(1));
        myvec1.push_back(Item(10));
        myvec1.push_back(Item(5));
        myvec1.push_back(Item(3));
        myvec1.push_back(Item(10));
    
    
        std::vector<Item> myvec2;
        myvec2.push_back(Item(10));
        myvec2.push_back(Item(1));
        myvec2.push_back(Item(10));
        myvec2.push_back(Item(1));
        myvec2.push_back(Item(3));
    
        std::sort(myvec1.begin(), myvec1.end());
        std::sort(myvec2.begin(), myvec2.end());
    
        myvec1.erase(std::unique(myvec1.begin(), myvec1.end()), myvec1.end());
        myvec2.erase(std::unique(myvec2.begin(), myvec2.end()), myvec2.end());
    
        std::vector<Item> myvec3; //Intersection of V1 and V2
        std::vector<Item> myvec4; //V1-V2
        set_intersection(myvec1.begin(),myvec1.end(), myvec2.begin(),myvec2.end(), std::back_inserter(myvec3)); //myvec3: 1 3 10
        set_difference(myvec1.begin(),myvec1.end(), myvec2.begin(),myvec2.end(), std::back_inserter(myvec4));   //myvec4: 2 5 
    }
    

    如果您使用的是stl,則對於第一個問題,可以使用set_intersection ,用於第二個set_difference

    @Amresh,這是您要使用帶指針矢量的示例。 但是我使用了boost :: shared_ptr而不是原始指針,因此您需要擔心內存管理:

    class Item;
    typedef boost::shared_ptr<Item> MyPtr;
    typedef std::vector<MyPtr> VecType;
    
    class Item
    {
    public:
        Item(int i):ItemId(i){}
        friend bool operator<(MyPtr lhs, MyPtr rhs);
        friend bool operator==(MyPtr lhs, MyPtr rhs);
    
       int ItemId;
       string ItemDescription;
       float ItemPrice;
    
       bool operator<(const Item& rhs)
       {
           return ItemId < rhs.ItemId;
       }
       bool operator==(const Item& rhs)
       {
           return ItemId == rhs.ItemId;
       }
    };
    
    
    
    bool operator<(MyPtr lhs, MyPtr rhs)
    {
        return lhs->ItemId < rhs->ItemId ;
    }
    
    bool operator==(MyPtr lhs, MyPtr rhs)
    {
        return lhs->ItemId == rhs->ItemId ;
    }
    
    int main()
    {
    
        VecType myvec1;
        myvec1.push_back(MyPtr(new Item(2)));
        myvec1.push_back(MyPtr(new Item(1)));
        myvec1.push_back(MyPtr(new Item(10)));
        myvec1.push_back(MyPtr(new Item(5)));
        myvec1.push_back(MyPtr(new Item(3)));
        myvec1.push_back(MyPtr(new Item(10)));
    
        VecType myvec2;
        myvec2.push_back(MyPtr(new Item(10)));
        myvec2.push_back(MyPtr(new Item(1)));
        myvec2.push_back(MyPtr(new Item(10)));
        myvec2.push_back(MyPtr(new Item(1)));
        myvec2.push_back(MyPtr(new Item(3)));
    
        std::sort(myvec1.begin(), myvec1.end());
        std::sort(myvec2.begin(), myvec2.end());
    
        myvec1.erase(std::unique(myvec1.begin(), myvec1.end()), myvec1.end());
        myvec2.erase(std::unique(myvec2.begin(), myvec2.end()), myvec2.end());
    
        VecType myvec3; //Intersection of V1 and V2
        VecType myvec4; //V1-V2
        set_intersection(myvec1.begin(),myvec1.end(), myvec2.begin(),myvec2.end(), std::back_inserter(myvec3)); //myvec3: 1 3 10
        set_difference(myvec1.begin(),myvec1.end(), myvec2.begin(),myvec2.end(), std::back_inserter(myvec4));   //myvec4: 2 5 
    }
    

    暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM