容器学习5——顺序容器的操作

向顺序容器中添加元素

  • 除了array数组外,所有的容器操作都可以动态的改变容器大小
  • 当我们使用这些操作时,必须记得不同容器使用不同的策略来分配元素空间,而这些策略会直接影响性能。在一个vector或string的尾部之外的任何位置,或是一个deque的首尾之外的任何位置添加元素,都需要移动元素。而且在向一个vector或string添加元素可能会引起整个对象存储空间的重新分配。重新分配一个对象的存储空间需要分配新的内存,并将元素从旧的空间移动到新的空间中

使用push_back和push_front操作

  • 除了forward_list和array外,每个顺序容器都支持push_back操作,push_back将元素放到容器尾部
  • push_front将元素放到容器的头部(注意:只有容器list,forward_list,deque支持push_front操作,vector和string不支持容器操作

在容器的特定位置插入元素

  • insert成员提供了更一般的功能,它允许我们在容器中的任意位置插入0个或者多个元素。vector,string,list,deque都提供了insert功能,forward_list提供了特殊的insert功能
  • insert函数的一个版本就是接受一个迭代器作为第一个参数,迭代器指出在容器的什么位置放置新的元素,他可以指向容器的任何位置(注意:insert是将元素插入到迭代器所指元素之前
  • insert的另外一个版本是除了第一个参数接受一个迭代器之外,还接受一个元素数目和一个值,表示在迭代器所指元素之前插入n个值相同的元素。或者第二和第三个参数接受两个迭代器,表示插入一个范围内的元素
  • 将元素插入到vector,deque和string的任何位置都是合法的,但是这样做可能会很耗时
  • 在新标准下,接受元素个数或范围的insert版本返回指向第一个新加入元素的迭代器(在旧版本下直接返回void),如果范围为空,不插入任何元素,则返回第一个参数的迭代器

访问顺序元素

在顺序容器中访问元素的操作
c.back() ;返回尾元素的引用。若c为空则函数无定义
c.front();返回首元素的引用。若c为空则函数无定义
c[n]; 返回c中下标为n的元素的引用,如果下标越界,则函数无定义
c.at(n);返回下标为n的元素的引用,如果下标越界,则抛出out_of_range异常
  • 访问成员函数返回的是引用,所以如果我们使用auto变量来保存这些函数的返回值,并且希望使用auto变量来改变该元素的值,必须记得将变量定义为引用类型

删除元素

pop_front和pop_back成员函数

pop_front和pop_back成员函数分别删除首元素和尾元素,这些操作返回的值是void,如果需要保存弹出元素的值,则需要在这些操作之前保存

从容器内部删除一个元素

成员函数erase从容器中指定位置删除元素。我们可以删除由一个迭代器指向的单个元素,也可以删除由一对迭代器指定范围内的所有元素,两种形式的erase、都返回指向删除元素之后位置的迭代器,如:

elem1=slist.erase(elem1,elem2)//调用后,elem1=elem2

迭代器elem1指向我们要删除的第一个元素,elem2指向我们要删除的最后一个元素之后的位置。

特殊的forward_list操作

  • 当添加或删除一个元素时,删除或添加的元素之前的那个元素的后继会发生改变,在一个forward_list中添加或删除元素的操作是通过改变给定元素之后的元素来完成的

改变容器大小

  • 我们可以用resize来增大或者缩小容器,array容器不支持resize。如果当前大小大于所要求的大小,容器后部的元素就会被删除,如果当前大小小于新大小,将新元素添加到容器后步:
list<int>ilist(10,42);
ilist.resize(15);//将五个值为0的元素添加到ilist的末尾
ilist.resize(5);//从ilist末尾删除20个元素
发布了37 篇原创文章 · 获赞 0 · 访问量 556

猜你喜欢

转载自blog.csdn.net/clearLB/article/details/104202688