C++ STL删除vector中指定元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ STL删除vector中指定元素相关的知识,希望对你有一定的参考价值。
有一个类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())的模式进行剔除,但小弟才疏学浅,未能找到一个方法
实现比较算子。
心情好+没事做
这很难吗?不就是用游标取出然后做一个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不一样就++查下一个
参考技术A 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掉的都要移动。最好的办法就是用一个特殊值去代替要删除的值,然后用第二种方法全部替换成特殊值,然后再一起删除。
追问感谢您的回答
参考技术B class functionprivate :
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());
本回答被提问者采纳 参考技术C 好高端 好专业~
删除List中指定的元素
删除List中指定的元素
CopyOnWriteArrayList是ArrayList的一个线程安全的变体实现,即可在多线程并发环境中使用
List<Map<String, Object>> allUsers = (List<Map<String, Object>>) userService.getAllUsers().get("allUser"); CopyOnWriteArrayList allUser = new CopyOnWriteArrayList(allUsers); Iterator<Map<String, Object>> iter = allUser.iterator(); while (iter.hasNext()) { Map<String, Object> map = iter.next(); Iterator<Map.Entry<String, Object>> iterSub = map.entrySet().iterator(); while (iterSub.hasNext()) { Map.Entry entry = iterSub.next(); if(entry.getKey().equals("username")){ logger.info("username: " + entry.getKey()); if (entry.getValue().equals("admin")){ logger.info("admin: " + entry.getValue()); allUser.remove(map); } } } } logger.info("allUser: " + allUser);
以上是关于C++ STL删除vector中指定元素的主要内容,如果未能解决你的问题,请参考以下文章