C ++中两个指针向量的减法和交集

时间:2011-08-05 11:33:11

标签: c++ stdvector

我有两个向量,指向我的自定义类对象。
这两个向量中的指针不指向同一个对象,但存储在对象中的值是相同的。

我的自定义类结构是:


Class Item
{
   string ItemId;
   string ItemDescription;
   float ItemPrice;
}
第一个向量( V1 )具有 n 条目,第二个向量( V2 )具有 m 条目< EM>(N&GT;米)。

我要进行两项操作:

  • 获取一个在 V1 V2 中都有共同对象的向量。 通常,我的意思是说元素的ItemId是相同的。(可以称为 V1和V2的交点 )。< p>

  • 获取具有 V2 中不存在的元素的向量。 (可以称为 V1-V2 )。

    如何以有效的方式做到这一点?

  • 3 个答案:

    答案 0 :(得分:5)

    以下是如何使用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 
    }
    

    答案 1 :(得分:2)

    如果您使用的是stl,对于第一个问题,您可以使用set_intersection,第二个set_difference

    答案 2 :(得分:1)

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