vector,CCArray等元删除满足条件元素的删除(比如删除大于2的元素)

1,正序删除
#include<iostream>
#include<vector>
using namespace std;

void main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    
    for(vector<int>::iterator iter = v.begin(); iter != v.end();)
    {
        if(*iter >= 2)
        {
            cout<<*iter<<endl;
            iter = v.erase(iter);
        }
        else
            iter++;
    }
    
}

/*
 2
 3
 4
 5
 */
 
 
 
 

总结 :

当删除第1个元素后,iter指向原来的第2个元素,其实还是现在的第1个元素。也就是说,每次都删除第一个元素。

不删除的话,正常的++,从而指向下一个元素。

2,倒序删除

for(vector<int>::iterator iter = v.end() - 1; iter >= v.begin(); iter--){
    if(*iter >= 2){
        cout<<*iter<<endl;
        iter = v.erase(iter);
    }
}
/*
 5
 4
 3
 2
 */

总结:

每次删除最后一个元素后,iter指向end,然后减去1,从而又指向最后一个元素。从而每次删除最后一个元素。

3,在CCArray中倒序删除元素。

如,rpg游戏中,移除血量小于0的敌人,就可以采用倒序删除的方法。

int SGFight::refreshArr()	
{
	for(int i = arrHero->count() - 1; i >= 0; i--)
	{
		if(((SGRole*)arrHero->objectAtIndex(i))->getCurHp() <= 0)
		{
			arrHero->removeObjectAtIndex(i);
			if(arrHero->count() == 0)
			{
				return FIGHT_ENEMY_WIN;
			}
		}
	}
	for(int i = arrEnemy->count() - 1; i >= 0; i--)
	{
		if(((SGRole*)arrEnemy->objectAtIndex(i))->getCurHp() <= 0)
		{
			arrEnemy->removeObjectAtIndex(i);
			if(arrEnemy->count() == 0)
			{
				return FIGHT_HERO_WIN;
			}
		}
	}
	return FIGHT_NORMAL;
}

总结:

i指向最后一个元素的索引 ,删除后,i不变。然后减去1,从而依然指向最后1个元素。

 

你可能感兴趣的:(vector,CCArray等元删除满足条件元素的删除(比如删除大于2的元素))