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())的模式进行剔除,但小弟才疏学浅,未能找到一个方法
实现比较算子。
展开
 我来答
deadbigbird
2017-11-10 · TA获得超过105个赞
知道答主
回答量:85
采纳率:84%
帮助的人:28.6万
展开全部

心情好+没事做

这很难吗?不就是用游标取出然后做一个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不一样就++查下一个
}
}
}
jackwind1987
2013-11-20 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:492万
展开全部
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掉的都要移动。最好的办法就是用一个特殊值去代替要删除的值,然后用第二种方法全部替换成特殊值,然后再一起删除。

追问
感谢您的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chujiangke001
推荐于2017-09-14 · TA获得超过1605个赞
知道小有建树答主
回答量:1352
采纳率:0%
帮助的人:697万
展开全部
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());
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吉林牛魔王X
2013-11-20 · TA获得超过168个赞
知道小有建树答主
回答量:271
采纳率:100%
帮助的人:70.4万
展开全部
好高端 好专业~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式