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 就失效了。

参考:

emplace:

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

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

猜你喜欢

转载自blog.csdn.net/hc372893308/article/details/83046973
今日推荐