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 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());
本回答被提问者采纳
参考技术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中指定元素的主要内容,如果未能解决你的问题,请参考以下文章

AS3.0删除数组中指定位置的元素

Javascript中如何删除数组中指定元素后形成新的数组

Javascript中如何删除数组中指定元素后形成新的数组

java 如何找到数组中指定的元素的下标

Python如何删除numpy数组中指定值的元素

js删除数组中指定元素或者空字符串