Effective_STL 学习笔记(五) 尽量使用区间成员函数代替他们的单元素兄弟
给定两个vector,v1和v2,使v1的内容和v2的后半部分一样的最简单的方式是什么?
v1.assign( v2.begin() + v2.size()/2, v2.end() );
两点说明:
1. assign成员函数对于所有标准序列容器(vector、string、deque和list)都有效;
2. 区间成员函数使用两个迭代器参数来指定元素的一个区间来进行某个操作。避免造成效率损失的循环
关于 copy 说明:
几乎所有的目标区间通过插入迭代器(inserter、back_inserter 或 front_inserter)指定的copy的使用,
都可以(应该)通过调用区间成员函数来代替。
copy( v2.begin() + v2.size() / 2,v2.end(),back_inserter(v1) ); // 用下式替换
v1.insert( v1.end(), v2.begin() + v2.size() / 2, v2.end() );
建议:几乎所有目标区间被插入迭代器指定的 copy 地使用都可以用调用的区间成员函数来代替。
用区间成员函数代替它们的单元素兄弟的理由:
一般来说使用区间成员函数可以输入更少的代码;
区间成员函数会导致代码更清晰更直接了当;
当处理标准序列容器时:效率,单元素操作需要更多的内存分配,更频繁的拷贝对象;
把一个 int 数组拷贝到 vector 的前端:
1 int data[ numValues ]; 2 vector<int> v; 3 v.insert( v.begin(), data, data + numValues );
而循环和copy的做法(只列出copy)
copy(data, data + numValues, inserter(v,v.begin() ) );
成员函数好在三点说明:
1. 避免多余的函数调用开销;
2. 避免多余的位置移动开销;
3. 避免多余的内存分配处理。
对于关联容器效率问题几乎没有,但是附加的重复调用单元素 insert 函数的开销问题存在。
即使没有效率的立场,写代码使用区间成员函数需要更少的输入这个事实任然存在。
支持区间的成员函数:
区间构造:
container::container( InputIterator begin, InputIterator end ); // 所有标准序列容器
区间插入:
void container::insert( iterator position, InputIterator begin, InputIterator end );
void container::insert( InputIterator begin, InputIterator end );// 关联容器使用它们的比较函数决定插入位置
单元素插入还包括:
push_front、push_back以及 copy的参数是 front_inserter 或者 back_inserter
区间删除:
iterator container::erase( iterator begin, iterator end ); // 序列容器
void cointainer::erase( iterator begin, iterator end ); // 关联容器
区间赋值:
void container:;assign( InputIterator begin, InputIterator end ); // 所有标准序列容器