第9章 顺序容器(4)

本文深入探讨了顺序容器在C++中的使用,包括类型别名、begin和end成员、添加元素的方法(如push_back、push_front、insert等),以及在不同位置添加元素的技巧。此外,文章强调了添加元素时可能引发迭代器失效的问题,并提供解决方案。

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

9.3 顺序容器的操作

9.3.1 容器定义的类型别名

我们已经使用过三种容器定义的类型:size_type、iterator和const_iterator。

9.3.2 begin和end成员

如果容器不是const,则这些操作返回iterator或reverse_iterator类型。如果容器是const,则其返回类型要加上const_前缀,也就是const_iterator和const_reverse_iterator类型。

9.3.3 在顺序容器中添加元素

所有顺序容器都支持push_back操作,提供在容器尾部插入一个元素的功能。

	vector<int> m;
	m.push_back(100);
	m.push_back(1000);
	for(vector<int>::iterator beg = m.begin();beg!=m.end();++beg)
	{
		cout << *beg << endl;
	}
除了朴实_back运算,list和deque容器类型还提供了类似的操作:push_front。这个操作实现在容器首部插入新元素的功能。

	list<int> m;
	m.push_back(100);
	m.push_back(1000);
	m.push_front(10000);
	for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
	{
		cout << *beg << endl;
	}
在容器中添加元素时,系统将元素值复制到容器里。类似地,使用一段元素初始化新容器时,新容器存放的是原始元素的副本。被复制的原始值与新容器中的元素各不相关,此后容器内元素值发生变化时,被复制的原值不会受到影响,反之亦然。

1. 在容器中指定位置添加元素

insert操作提供了一组更通用的插入方法,实现在容器的任意指定位置插入新元素。

	list<int> m;
	m.push_back(100);
	m.push_back(1000);
	m.push_front(10000);
	m.insert(m.begin(), 1000000);
	for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
	{
		cout << *beg << endl;
	}
2. 插入一段元素

insert函数的第二个版本提供在指定位置插入数量相同元素的功能。

insert函数的最后一个版本实现在容器中插入由一对迭代器标记的一段范围内的元素。

	int arr[4] = {1, 2, 3, 4};
	list<int> m;
	m.push_back(100);
	m.push_back(1000);
	m.push_front(10000);
	m.insert(m.begin(), 1000000);
	m.insert(m.begin(), 10, 1);
	m.insert(m.begin(), arr, arr+4);
	for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
	{
		cout << *beg << endl;
	}

3. 添加元素可能会使迭代器失效

任何insert或push操作都可能导致迭代器失效。当编写循环将元素插入到vector或deque容器中时,程序必须确保迭代器在每次循环后都得到更新。

4. 避免存储end操作返回的迭代器

由end操作返回的迭代器,在容器的任何位置插入任何元素都会使该迭代器失效。

不要存储end操作返回的迭代器。添加或删除deque或vector容器内的元素都会导致存储的迭代器失效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值