第9章 顺序容器(5)

本文深入解析C++容器中的元素删除方法(pop_front, pop_back, erase, clear)及赋值操作(assign, swap),详细说明各函数特性、使用场景与注意事项,特别强调迭代器失效问题及避免成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9.3.7 删除元素

1. 删除第一个或最后一个元素

pop_front和pop_back函数用于删除容器内的第一个和最后一个元素。但vector容器类型不支持pop_front操作。这些操作删除指定的元素并返回void。

pop_front和pop_back函数的返回值并不是删除的元素值,而是void。要获取删除的元素值,则必须在删除元素之前调用front或back函数。

2. 删除容器内的一个元素

删除一个或一段元素更通用的方法是erase操作。该操作有两个版本:删除由一个迭代器指向的单个元素,或删除由一对迭代器标记的一段元素。erase的这两种形式都返回一个迭代器,它指向被删除元素或元素段后面的元素。

如同其他操作一样,erase操作也不会检查它的参数。程序员必须确保用作参数的迭代器或迭代器范围是有效的。

3. 删除容器内所有元素

要删除容器内所有的元素,可以调用clear函数,或将begin和end迭代器传递给erase函数。

erase、pop_front和pop_back函数使指向被删除元素的所有迭代器失效。对于vector容器,指向删除点后面的元素的迭代器通常也会失效。而对于deque容器,如果删除时不包含第一个元素或最后一个元素,那么该deque容器相关的所有迭代器都会失效。

9.3.8 赋值与swap

赋值和assign操作时做操作数容器的所有迭代器失效。swap操作则不会使迭代器失效。完成swap操作后,尽管被交换的元素已经存放在另一容器中,但迭代器仍然指向相同的元素。

assign操作首先删除容器中所有的元素,然后将其参数所指定的新元素插入到该容器中。

由于assign操作首先删除容器中原来存储的所有元素,因此,传递给assign函数的迭代器不能指向调用该函数的容器内的元素。

带有一对迭代器参数的assign操作允许我们将一个容器的元素赋给另一个不同类型的容器。

	vector<int> i(1, 2);
	list<int> m;
	m.assign(i.begin(), i.end());

	for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
	{
		cout << *beg << endl;
	}
assign运算的第二个版本需要一个整型数值和一个元素值做参数,它将容器重置为存储指定数量的元素,并且每个元素的值都为指定值。

	list<int> m;
	m.assign(2,3);

	for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
	{
		cout << *beg << endl;
	}
2. 使用swap操作以节省删除元素的成本

swap操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须匹配:操作数必须是相同类型的容器,而且所存储的元素类型也必须相同。

swap操作不会删除或插入任何元素,而且保证在常量时间内实现交换。对于容器内没有移动任何元素,因此迭代器不会失效。

没有移动元素这个事实意味着迭代器不会失效。

	list<int> i(1, 2);
	list<int> m;
	m.assign(2,3);
	i.swap(m);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值