[C/C++标准库]_[初级]_[std::vector的删除元素]


std::vector


场景:

1.std::vector需要根据条件删除特定的元素。

2.std::vector的iterator在删除后这个iterator是失效的,所以不能直接++iter,这时候只能取erase的返回值下一个iterator作为有效的iter使用.


#include <stdio.h>
#include <assert.h>
#include <vector>

typedef struct closure closure;

struct closure
{
	int isAllow;
};

int main(int argc, char *argv[])
{
	std::vector<closure*> infos;
	closure c1;
	c1.isAllow = 1;

	closure c2;
	c2.isAllow = 0;

	closure c3;
	c3.isAllow = 1;

	closure c4;
	c4.isAllow = 0;

	closure c5;
	c5.isAllow = 0;

	infos.push_back(&c1);
	infos.push_back(&c2);
	infos.push_back(&c3);
	infos.push_back(&c4);
	infos.push_back(&c5);

	printf("begin delete\n");
	std::vector<closure*>::iterator iter;
	for(iter = infos.begin();iter != infos.end();)
	{
		closure* c = *iter;
		if(c->isAllow)
		{
			iter = infos.erase(iter);
		}else
		{
			++iter;
		}
	}

	printf("end delete %d\n",infos.size());
	for(iter = infos.begin();iter != infos.end();++iter)
	{
		closure* c = *iter;
		assert(!c->isAllow);
	}
	printf("end list left.\n");
	return 0;
}

输出:

begin delete
end delete 3
end list left.

补充: 2015.5.19

如果要删除某个索引值,建议用递减的方式来删除,--i,因为这样低位置的索引不会因为高位置的元素删除而改变。

删除索引为7的元素,可以直接使用ite+7的方式来erase.

erase(ite+7);



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/infoworld/article/details/15736305
个人分类: 组件类库
所属专栏: C C++标准库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭