C++ ---- 顺序容器(二)

2 顺序容器操作

除了array外,所有标准库容器都提供灵活的内存管理。

插入元素

 注意:

1. 其中 c.insert(p,b,e) 中,迭代器 b 和 e 不能指向c中元素。

2. 向一个vector 或 string 添加元素可能引起整个对象存储空间的重新分配。(重新分配一个对象的存储空间需要分配新的内存,并将元素从旧的空间移动到新的空间中。)

3. 元素容器是拷贝。将一个对象放入容器中,都是指将对象拷贝到容器中。

emplace:(待续)

C++11中,针对顺序容器(如vector、deque、list),新标准引入了三个新成员:emplace_front、emplace 和 emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应push_front、insert和push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。

当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。
例如,假定 c 保存Sales_data元素:

 // 在c的末尾构造一个Sales_data对象

 // 使用3个参数的Sales_data构造函数

c.emplace_back("978-0590353403", 25, 15.99);

 // 错误:没有接受三个参数的push_back版本

c.push_back("978-0590353403", 25, 15.99);

 // 正确:创建一个临时的Sales_data对象传递给push_back

c.push_back(Sales_data("978-0590353403", 25, 15.99));

emplace函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配。emplace函数在容器中直接构造元素。传递给emplace函数的参数必须与元素类型的构造函数相匹配。

emplace 相关函数可以减少内存拷贝和移动。当插入rvalue,它节约了一次move构造,当插入lvalue,它节约了一次copy构造。

// iter 指向 c 中一个元素,其中保存了Sales_data 元素

c.emplace_back();   // 使用Sales_data 的默认构造函数

c.emplace(iter, "999-999999999");   // 使用 Sales_data(string)

// 使用 Sales_data 的接受一个ISBN、一个count 和一个price 的构造函数

c.emplace_front("978-0590353403", 25, 15.99);

访问元素

包括 array 在内的每个顺序容器都有一个front 成员函数,而除 forward_list 之外的所有顺序容器都有一个back 成员函数。这两个操作分别返回首元素尾元素的引用。

注意:

1. 迭代器 end 指向的是容器尾元素之后的(不存在的)元素,因此,若要指向最后一个元素需向前移动一位。

2. 若需使用  auto 变量来保存 front 和 back 成员函数返回值,并需希望使用该变量来改变元素的值,必须要将变量定义为引用类型: auto &v = c.back();

z

 删除元素

什么是失效?

vector <int> n = {1,2,3,4,5};

start = n.begin()+2;

n.erase(n.begin+1);

start 就失效了,需要更新。

具体使用程序如下:

#include <iostream>
#include <vector>
#include <list>
#include <forward_list> 

using namespace std;

int main()
{
	vector<int> ivec;
	for (int i=0;i<10;i++){
		ivec.push_back(i);
		// ivec.emplace_back(i); 
	}
	//vector<int>::iterator itor;
	auto itor = ivec.end();
	cout << "擦除之前:ivec[8] = " << *(itor-2) << "\n";
	ivec.insert(ivec.begin()+1,0);
	cout << "擦除之后:ivec[8] = " << *(itor-2)  << endl;
	return 0;
}

特殊的 forward_list 操作

由于其为单链表结构。而在一个单链表中,没有简单的方法来获取一个元素的前驱。因此,在一个 forward_list 中添加或删除元素的操作是通过改变给定元素之后的元素来完成的。

改变容器大小


 

 

 

 

 

 

参考:

emplace:

https://blog.csdn.net/fengbingchun/article/details/78670376

https://blog.csdn.net/windpenguin/article/details/75581552

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值