C++ primer 学习笔记 第9章 顺序容器 9.3 顺序容器操作

9.3 顺序容器操作

9.3.1 添加元素

向vector、string、deque中插入元素,会使指向容器的迭代器、引用、指针失效。

在vector或string尾部之外位置,deque首尾之外位置添加元素,都需要移动元素。

list、vector、deque、string支持push_back。

放入容器的是对象值的一个拷贝,而不是对象本身。

list、forward_list、deque支持push_front。deque具有随机访问元素的能力。

vector、deque、list、string支持insert。

slist.insert(slist.begin(),"hello!") ;

insert 接受迭代器为第一个参数,将元素插入至迭代器之前。

svec.insert(svec.end(), 10, "anna");

接受一个元素数目和一个值。

slist.insert(slist.begin(),v.end()-2, v.end());

接受一对迭代器或一个初始化列表,迭代器不能指向添加元素的目标容器。

C11标准中接受元素个数或范围的版本,返回指向第一个新加入元素的迭代器,老版本返回void。

C11新标准中引入了emplace_front、emplace和emplace_back,与insert等的不同之处在于它可以在容器中直接构造元素,传递给emplace函数的参数必须与元素类型的构造函数相匹配。

9.3.2 访问元素

若容器中没有元素,访问操作是未定义的。

at和下标操作只适用于string、vector、deque、array

back不适用于forward_list

如果下标越界,at会抛出一个out_of_range异常。

9.3.3 删除元素

会改变容器大小,不适用于array。

vector和string不支持pop_front,forward_list不支持pop_back。这些操作返回void。

c.erase(p),删除迭代器p指定的元素,返回被删元素之后元素的迭代器。若为尾后迭代器,则未定义。

c.erase(b,e),删除迭代器b和e指定范围的元素,若e为尾后迭代器,则返回尾后迭代器。

9.3.4 forward_list

没有定义insert、emplace、erase,定义了insert_after、emplace_after、erase_after。

lst.before_begin()返回指向首元素之前不存在元素的迭代器。

9.3.5 改变容器大小

不适用于array,resize操作接受一个可选的元素值参数,若未提供,新元素进行值初始化。

9.3.6 容器操作可能会使迭代器失效

不要保存end返回的迭代器。

发布了48 篇原创文章 · 获赞 29 · 访问量 9810

猜你喜欢

转载自blog.csdn.net/flyconley/article/details/100122402