给2个vector v1, v2,使v1的内容和v2后半部分相同的最简单的操作是什么?
答案是:
v1.assign(v2.begin() + v2.size() / 2, v2.end());
可以看出,使用区间成员函数比相应的单元素成员函数简洁很多且意图清晰直接。
区间成员函数使代码更加易写易懂。
这不仅仅是风格问题,对于标准序列容器,如果使用循环+单元素成员函数,将会更频繁地拷贝对象,更多的调用函数,更多次申请新内存块,及其他冗余操作。
对于关联容器,虽然优化空间相对小,但至少相比循环+单元素成员函数,它的效率不会更低。
选择区间成员函数而不是单元素成员函数的三大理由:写起来更容易,更清晰易读,更高的效率。
下面是一些支持区间的成员函数:(InputIterator表示任何类型的输入迭代器都是可接受的)
区间创建:所有标准容器都提供如下构造函数:
container::container(InputIterator begin, //区间开始
InputIterator end); //区间结束
区间插入:所有标准序列容器都提供如下的insert:
void container::insert(interator position, //在何处插入区间
InputIterator begin, //区间开始
InputIterator end); //区间结束
关联容器用比较函数决定插入位置,省略了第一个参数:
void container::insert(InputIterator begin, InputIterator end);
区间删除:所有标准序列容器都提供如下的erase:
iterator container::erase(iterator begin, iterator end);
关联容器的返回值有所不同:
void container::erase(iterator begin, iterator end);
需要注意的是,erase对于vector和string时,并不会减少内存。(EC3-17指出怎样减少他们占用的多余内存)
区间赋值:所有标准容器都提供了区间形式的assign:
void container::assign(InputIterator begin, InputIterator end);