接下来,在讲具体的每个容器之前,我们还是以vector为例子介绍容器的一些共通的操作。
首先是清空和判断容器是否为空,这是所有容器都共通的行为。
动手写12.1.4


动手写12.1.4展示了清空容器和容器是否为空的判断,运行结果如图12.1.4所示:

图12.1.4 清空容器
clear()函数将会删除容器中所有的元素,而相对应地,如果要删除一个或者部分元素,我们可以使用erase()函数。由于erase()函数是基于迭代器的,因此也是所有容器通用的,它所对应的基于迭代器添加元素的函数是insert()。下面我们来看一个示例:
动手写12.1.5


动手写12.1.5展示了添加、删除容器元素的方法,运行结果如图12.1.5所示:

图12.1.5 添加和删除容器元素
我们可以在示例中看到,利用加法的方式,我们可以将容器起始的迭代器指向特定的元素(只有特定容器的迭代器才可以),insert()在这个时候往这个迭代器指向的元素前插入一个或多个元素,而删除的时候则是删除迭代器指向的元素。但是在范围删除的时候只能删除到后一个迭代器的前一个元素,所以在指定“vec.end()-1”的时候我们并不会删掉最后一个元素。这样的设计也是为了方便指定end()作为后一个迭代器,那样就可以直接删除到最后一个元素了。(https://www.xing528.com)
使用erase()删除是基于元素的位置信息决定的,但是在实际应用场景中,根据元素的值来删除会显得更加直观。在STL里这样的操作会显得比较烦琐,需要同时使用erase()和remove()来完成。不过关联容器也有直接的按值删除版本的erase()函数。接下来我们看看使用erase()和remove()按值删除容器元素的方法,这种方法又叫作Erase-Remove惯用法(Erase-Remove Idiom)。
动手写12.1.6


动手写12.1.6展示了Erase-Remove惯用法,运行结果如图12.1.6所示:

图12.1.6 Erase-Remove惯用法
我们可以看到remove()有3个参数,分别界定了搜索的范围和查找的值。在打印remove()后的容器时,我们发现第一到第五个元素已经是删除1后容器该有的样子了,只是remove()不能移除后面不需要的元素,为此我们还需要借助erase()的帮助。remove()的返回值是指向第一个无效元素的迭代器,大多数情况下我们只需要这个迭代器和end()之间的所有无效元素就行了。最后要注意的是,使用remove()需要包含<algorithm>,大多数STL泛型算法都定义在<algorithm>中,在本章的最后一节中我们会介绍泛型算法。
最后还要简单介绍的一个小操作是swap。顾名思义,它的作用就是交换两个容器的元素。
动手写12.1.7


动手写12.1.7直观地展示了swap的用法。运行结果如图12.1.7所示:

图12.1.7 swap的用法
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
