首页 > 代码库 > Effective STL: 尽量使用区间成员函数代替它们的单元素兄弟

Effective STL: 尽量使用区间成员函数代替它们的单元素兄弟

尽量使用区间成员函数代替它们的单元素兄弟的理由

  • 一般来说使用区间成员函数可以输入更少的代码。
  • 区间成员函数会导致代码更清晰更直接了当。
  • 当处理标准序列容器时,应用单元素成员函数比完成同样目的的区间成员函数需要更多地内存分配,更频繁地拷贝对象,而且/或者造成多余操作。
// 把一个int数组拷贝到vector前端

int data[numValues]; // 假设numValues在其他地方定义vector<int> v;
...

// 区间成员函数版本
v.insert(v.begin(), data, data + numValues); // 把data中的int插入v前部

// 单元素循环版本vector<int>::iterator insertLoc(v.begin());
for (int i = 0; i < numValues; ++i)
{
    insertLoc = v.insert(insertLoc, data[i]);
    ++insertLoc;
}

单元素循环版本缺点(此处针对vector)

  • 更多的函数调用(每次循环都有一次insert调用)
  • 更多次的插入位置后的元素移动(每次循环都要移动后面的元素各一次)
  • 可能导致多次内存重新分配(每次分配后会涉及到对象的拷贝,构造,析构等)
  • 要小心翼翼地维护insertLoc的值,用于下次循环

支持区间的成员函数总结:

  • 区间构造。所有标准容器都提供这种形式的构造函数:

    container::container(InputIterator begin, // 区间的起点
                         InputIterator end);      // 区间的终点
  • 区间插入。

    • 所有标准序列容器都提供这种形式的insert:
      void container::insert(iterator position, // 区间插入的位置
                         InputIterator begin, // 插入区间的起点
                         InputIterator end); // 插入区间的终点
    • 关联容器使用它们的比较函数来决定元素要放在哪里,所以它们了省略position参数。
      void container::insert(lnputIterator begin, InputIterator end);
      
  • 区间删除。

    • 每个标准容器都提供了一个区间形式的erase,但是序列和关联容器的返回类型不同。序列容器提供了这个:

      iterator container::erase(iterator begin, iterator end);
      
    • 关联容器提供这个:

      void container::erase(iterator begin, iterator end);
      
  • 区间赋值。所有标准列容器都提供了区间形式的assign:

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

Effective STL: 尽量使用区间成员函数代替它们的单元素兄弟