插入型迭代器(Insert Iterator)又称为插入器(Inserter)。用来将“赋值新值”操作转换为“插入新值”操作。通过插入型迭代器,算法可以执行插入行为而非覆盖行为。所有插入型迭代器都隶属于输出型迭代器类型,只提供“赋予新值”的功能。
插入型迭代器可以把上述的赋值操作转化为插入操作。实际上这里面有两个操作:运算符“∗”传回迭代器的当前位置,然后由“operator=”赋值新值。插入型迭代器通常使用以下两个技巧:
1)“operator∗”被作为一个无实际动作的动作,简单传回∗this。对插入型迭代器来说,∗pos与pos等价。
2)赋值操作被转化为插入操作。事实上插入型迭代器会调用容器的push_back()、push_front()或insert()成员函数。
对于一个插入型迭代器,插入新值可以采用两种形式:pos=value和∗pos=value。但正确的表达式应该是∗pos=value。
插入型迭代器分3种类型:后插入型迭代器(Back Inserter)、前插入型迭代器(Front-lnserter)和产生型迭代器(Generallnserter)。它们之间的区别在于插入位置的不同。在迭代器初始化时,一定要清楚自己所属的容器是哪一种。每一种插入迭代器均由一个对应的便捷函数对其加以生成和初始化(见表5-4)。
表5-4 插入型迭代器的分类
容器本身必须支持插入型迭代器所调用的函数,否则该插入型迭代器不可用。例如,后插入型迭代器只能用在vector、deque、list、string等类型的容器上,前插入型迭代器只能用在deque和list型容器上。原因很简单,相应型别的容器必须具备相应型别的迭代器所对应的可调用成员函数。
后插入型迭代器生成时必须根据其所属容器进行初始化。back_inserter()函数为此提供了捷径。前面章节已经大量使用了back_inserter()函数。back_inserter()在插入元素时,会造成指向该vector的其他迭代器失效。string也提供了STL容器接口,包括成员函数push_back()。同时可以使用back_inserter()函数为string型容器追加字符串。(www.xing528.com)
前插入型迭代器生成时必须根据其所属容器进行初始化。front_inserter()函数为此提供了捷径。前插入型迭代器透过成员函数push_front()将一个元素值加在容器头部。而push_back()仅在deque和list中有所实现。而C++ STL中就只有这两个类型的容器支持前插入型迭代器。值得一提的是,在插入多个元素时,前插入型迭代器以逆序方式插入,因为它总是将后一个元素插于前一个元素的前面。
产生型迭代器根据两个参数初始化:①容器;②待插入位置。迭代器内部以“待插入位置”为参数,调用成员函数insert()。inserter()函数则可以提供更方便的手段产生产生型迭代器,并将其初始化。本类迭代器对所有标准容器均适用,因为所有容器都有insert()成员函数。然而对关联式容器而言,插入位置仅是标识,元素的真正位置要根据其实值或键值而定。插入操作完成后,产生型迭代器获得被插入元素的位置。在deque、vector和string型容器中,为确保该迭代器的位置始终有效,该产生型迭代器本身会失效。其实,每一次插入操作都会使指向容器的所有迭代器失效。
关联式容器的定制型插入型迭代器:对于关联式容器,产生型迭代器的“位置参数”仅仅是个提示,用于加快速度。如果产生型迭代器使用不当,反而可能导致性能下降。如果逆序插入,会较缓慢,甚至导致插入错误。这也是STL的缺陷之一。
例5-3
例5-3的执行效果如图5-4所示。
图5-4 例5-3的执行效果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。