C++Primer_Chap09_顺序容器_List03_顺序容器操作_笔记

向顺序容器添加元素的操作
这些操作会改变容器的代销;array不支持这些操作
forward_list有自己专有版本的insert和emplace
forward_list不支持push_back和emplace_back
vector和string不支持push_front和emplace_front

c.push_back(t)

c.emplace_back(args)

在c的尾部创建一个值为t或由args创建的元素。返回void

c.push_front(t)

c.emplace_front(args)

在c的头部创建一个值为t或由args创建的元素。返回void

c.push(p, t)

c.emplace(p, args)

在迭代器p指向的元素之前创建一个值为t或由args创建的元素。返回指向新添加元素的迭代器
c.insert(p, n, t)在迭代器p指向的元素之前插入n个值为t的元素。返回指向新添加的第一个元素的迭代器;若n为0,返回p
c.insert(p, b, e)在迭代器p指向的元素之前插入迭代器b和e指定范围内的元素。返回指向新添加的第一个元素的迭代器;若范围为空,返回p
c.insert(p, i1)i1是一个花括号包围的元素值列表,将这些给定值插入到迭代器p指向的元素之前。返回指向新添加的第一个元素的迭代器;若范围为空,返回p

warning:向一个vector、string或deque插入元素会使所有指向容器的迭代器、引用和指针失效

当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们低啊用一个emplace成员函数时,则是将参数传递至元素类型的构造函数中。

//在c的末尾构造一个Sales_data对象
//使用三个参数的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.9));
在顺序容器中访问元素的操作
at和下标操作只适用于string、vector、deque和array
back不适用于forward_list
c.back()返回c中尾元素的引用。若c为空,函数行为未定义

c.front()

返回c中头元素的引用。若c为空,函数行为未定义
c[n]返回c中下标为n的元素元素的引用,n是一个无符号整数。若n>=c.size(),函数行为未定义
c.at(n)返回c中下标为n的元素元素的引用。若下标越界,则抛出out_of_range异常
if(!c.empty())
{
	c.front() = 42;        //将42赋予c中第一个元素
	auto &v = c.back();    //获取指向c中最后一个元素的引用
	v = 1024;              //改变c中元素
	auto v2 = c.back();    //获取拷贝
	v2 = 0;                //未修改c中元素
}


vector<string> svec;        //空vector
cout << svec[0];            //运行时错误
cout << svec.at(0);         //抛出out_of_range异常
顺序容器的删除操作
这些操作会改变容器大小,不适用于array
forward_list有特殊版本的erase
forward_list不支持pop_back;vector和string不支持pop_front
c.pop_back()删除c中尾元素。若c为空,则函数行为未定义。函数返回void
c.pop_front()删除c中首元素。若c为空,则函数行为未定义。函数返回void
c.erase(p)删除迭代器p所指定的元素,返回一个指向被删元素之后的元素的迭代器。若p指向尾元素,则返回尾后(off_the_end)迭代器。若p是尾后迭代器,则函数行为未定义
c.erase(b,e)删除迭代器b和e所指定范围内的元素。返回一个指向最后一个被删元素之后的元素迭代器,若e本身就是尾后迭代器,则函数也返回尾后迭代器
c.clear()删除c中的所有的元素。返回void
在forward_list中插入或删除元素的操作

lst.before_begin()

lst.cbefore_begin()

返回一个指向链表首元素之前不存在的元素的迭代器,不能解引用。cbefore_begin()返回一个const_iterator

lst.insert_after(p, t)

lst.insert_after(p, n, t)

lst.insert_after(p, b, e)

lst.insert_after(p, il)

在迭代器p之后的位置插入元素(b和e不能指向lst内,il是一个花括号列表)返回一个指向最后一个插入元素的迭代器。如果范围为空,则返回p。若p是尾后迭代器,则函数行为为定义
emplace_after(p, args)使用args在p指定的位置之后创建一个元素。返回一个指向这个新元素的迭代器。若p是尾后迭代器,则函数行为为定义

lst.erase_after(p)

lst.erase_after(b, e)

删除元素。返回一个指向被删除元素之后的元素的迭代器。若不存在这样的元素,则返回尾后迭代器。如果p指向lst的尾元素或者是尾后迭代器,则函数行为未定义

容器操作对迭代器的影响

  在容器中添加元素:

  • 如果容器是vector或string,且存储空间被重新分配,则指向容器的迭代器、引用和指针都会失效。如果存储空间未重新分配,指向插入位置之后元素的迭代器、引用和指针将会失效
  • 对于deque,插入到除首尾位置之外的任何位置都会导致迭代器、引用和指针失效。如果在首尾位置添加元素,迭代器会失效,但指向元素的引用和指针不会失效
  • 对于list和forward_list,无影响

  在容器中删除元素

  • 指向被删除元素的迭代器、引用和指针会失效
  • 对于list和forward_list,无影响
  • 对于deque,删除除首尾位置之外的任何位置都会导致迭代器、引用和指针失效。如果在首尾位置删除元素,尾后迭代器会失效,但其他迭代器和指向元素的引用和指针不会失效
  • 对于vector和string,指向被删元素之前的迭代器、引用和指针仍有效。
  • 删除元素时,尾后迭代器总会失效
容器大小管理操作
shrink_to_fit只适用于vector、string和deque
capacity和reverse只适用于vector和string
c.shrink_to_fit()

将capacity()减少为和size()相同大小

c.capacity()不重新分配内存空间的话,c可以保存多少元素
c.reverse(n)分配至少能容纳n个元素的内存空间

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值