C++ STL删除vector中指定元素
有一个类TCards其中有ID与VALUE两个属性,值可以相同,但是ID一定唯一现定义DataVector<TCards>dvCardAll;Datavector<TCa...
有一个类TCards 其中有ID与VALUE两个属性,值可以相同,但是ID一定唯一
现定义
DataVector<TCards> dvCardAll;
Datavector<TCards> dvCardReject;
DataVector继承与STL的vector,两个容器均已赋值,
现需要将dvCardAll中所有的与dvCardReject中元素的VALUE属性相同的元素剔除,求方法。
例:
定义:ID=D,VALUE=V
若dvCardAll中有三个元素,分别为([D=1,V=2],[D=2,V=3],[D=3,V=2])
dvCardReject中有元素 ([D=5,V=2],[D=7,V=3])
则需要将dvCardAll中所有元素删除
PS:我曾考虑使用dvCardAll.erase(find_if())的模式进行剔除,但小弟才疏学浅,未能找到一个方法
实现比较算子。 展开
现定义
DataVector<TCards> dvCardAll;
Datavector<TCards> dvCardReject;
DataVector继承与STL的vector,两个容器均已赋值,
现需要将dvCardAll中所有的与dvCardReject中元素的VALUE属性相同的元素剔除,求方法。
例:
定义:ID=D,VALUE=V
若dvCardAll中有三个元素,分别为([D=1,V=2],[D=2,V=3],[D=3,V=2])
dvCardReject中有元素 ([D=5,V=2],[D=7,V=3])
则需要将dvCardAll中所有元素删除
PS:我曾考虑使用dvCardAll.erase(find_if())的模式进行剔除,但小弟才疏学浅,未能找到一个方法
实现比较算子。 展开
4个回答
展开全部
心情好+没事做
这很难吗?不就是用游标取出然后做一个Value比较吗?有什么纠结的?
for (std::vector<TCard>::iterator iter1 = dvCardReject.begin(); iter1 != dvCardReject.end(); ++iter1) {
for (std::vector<TCard>::iterator iter2 = dvCardAll.begin(); iter2 != dvCardAll.end(); /*注意这里没有++游标*/) {
TCard card1 = *iter1;
TCard card2 = *iter2;
if (card1.GetValue() == card2.GetValue()) {
iter2 = dvCardAll.erase(iter2);//找到了就擦除,游标会自动指向下一个
}
else {
iter2++;//value不一样就++查下一个
}
}
}
展开全部
class RemoveRejectPred {
public:
RemoveRejectPred(const Datavector<TCards>& dvCardReject) : reject(dvCardReject) {}
bool operator()(const Datavector<TCards>& a) {
for (int i = 0; i < a.size(); i++)
if (a.V == reject[i].V) return true;
return false;
}
private:
const Datavector<TCards>& reject;
};
dvCardAll.erase(remove_if(dvCardAll.begin(), dvCardAll.end(), RemoveRejectPred(dvCardReject) ));
这是一种写法,还有种方法是每次remove reject中的一个,直到reject所有的都被remove掉了为止,两种方法都有缺点,这个是同样的值每次都要循环去比较;另一种方法的缺点是每个reject掉的都要移动。最好的办法就是用一个特殊值去代替要删除的值,然后用第二种方法全部替换成特殊值,然后再一起删除。
追问
感谢您的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
class function{
private :
TCards tCard;
public :
function(TCards &temp)
{
tCard.D=temp.D;
tCard.V=temp.V;
}
bool operator() (TCards &temp)
{
if( tCard.D==temp.D&&tCard.V==temp.V)
return true;
return false;
}
};
for(int i=0;i<dvCardReject.size();i++)
{
dvCardALL.erase(remove_if(dvCardALL.begin(),dvCardALL.end(),function(dvCardReject[i])),devCardALL.end());
}
private :
TCards tCard;
public :
function(TCards &temp)
{
tCard.D=temp.D;
tCard.V=temp.V;
}
bool operator() (TCards &temp)
{
if( tCard.D==temp.D&&tCard.V==temp.V)
return true;
return false;
}
};
for(int i=0;i<dvCardReject.size();i++)
{
dvCardALL.erase(remove_if(dvCardALL.begin(),dvCardALL.end(),function(dvCardReject[i])),devCardALL.end());
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
好高端 好专业~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询