首页 > 代码库 > 区间成员函数优先于与之对应的单元素成员函数

区间成员函数优先于与之对应的单元素成员函数



例子:使v1的内容和v2的后半部分相同的最简单操作是什么?看下面四个答案:

v1.assign(v2.begin()+v2.size()/2,v2.end());

v1.clear();

 copy(v2.begin()+v2.size()/2,v2.end(),back_inserter(v1));

v1.insert(v1.end(),v2.begin()+v2.size()/2,v2.end());

vector<int>v1,v2;

 

 v1.clear();

 for(vector<int>::const_iterator ci = v2.begin()+v2.size()/2;ci !=v2.end();++ci)

    v1.push_back(*ci);

vector<int>::iteratorinsertLoc(v.begin());

 for(int i = 0;i < numValues;++i )

 {

             insertLoc= v.insert(insertLoc,data[i]);

             ++insertLoc;

}

太多的STL程序员滥用了copy,通过利用插入迭代器的方式来限定目标区间的copy调用,几乎都应该被替换为对区间成员函数的调用。因为当copy模板被实例化之后,基于copy的代码和使用显示循环的代码几乎是相同的。

第⑤种方式每次调用insert把新元素插入到v中时,插入点后的每个元素都要向后移动一个位置,以便为新元素腾出空间。与此不同的是,C++标准要求区间insert函数把现有容器中的元素直接移动到他们最终的位置上,即只需付出每个元素移动一次的代价。

优先选择区间成员函数而不是其对应的单元素成员函数由三条充分的理由:

  1. 区间成员函数写起来更容易

  2. 更能清楚地表达我们的意图

  3. 它们表现出了更高的效率

支持区间的成员函数有:

  1. 区间创建:所有的标准容器都提供了如下形式的构造函数:

        container::container(InputIterator begin,InputIterator end);

  2. 区间插入:所有的标准序列容器都提供了如下形式的insert

        void container::insert(iterator position,InputIterator begin,InputIteratorend);

    关联容器利用比较函数来决定元素该插入何处,它们提供了一个省去position参数的函数原型:

        void container::insert(InputIterator begin,InputIterator end);

  3. 区间删除:所有的标准容器都提供了区间形式的删除操作,但对于序列和关联容器,其返回值有所不同。序列容器提供了这样的形式:

        iterator container::erase(iterator begin,iterator end);

      关联容器则提供了如下形式:

        void container::erase(iterator begin,iterator end);

  4. 区间赋值:所有的标准容器都提供了区间形式的assign

        void container::assign(InputIterator begin,InputIterator end);