我有两个向量,指向我的自定义类对象。
这两个向量中的指针不指向同一个对象,但存储在对象中的值是相同的。
我的自定义类结构是:
Class Item
{
string ItemId;
string ItemDescription;
float ItemPrice;
}
第一个向量( V1 )具有 n 条目,第二个向量( V2 )具有 m 条目< EM>(N&GT;米)。
我要进行两项操作:
如何以有效的方式做到这一点?
答案 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
}