zoukankan      html  css  js  c++  java
  • 条目五《尽量使用区间成员函数代替它们的单元素兄弟》

    条目五《尽量使用区间成员函数代替它们的单元素兄弟》

    ** assign成员函数 主要是用于赋值,不像operator=只能拷贝一个同类型的容器,assign函数可以是赋值新的元素**。

    对所有标准序列容器(vector,string,deque和list)都有效。无论何时你必须完全代替一个容器
    的内容,你就应该想到赋值。如果你只是拷贝一个容器到另一个同类型的容器,operator=就是选择的赋值函数,但当想要给一个容器完全的新数据集时,assign就可以利用,但operator=做不了

    这是在对容器赋值时,首先考虑assign函数而不是operator=的原因。但是这不是本条目的重点哦,本条目主要是讲区间函数比单元素函数的优势。

    先来说结论:

    • 1.区间函数在表达上,简洁明了,代码优美。
    • 2.高效,比如赋值、插入等操作,区间函数可以一次操作完成,而单元素函数是n次。这意味着单元素函数在操作时需要分配和销毁更多的内存,频繁的拷贝对象,造成多余的操作。

    看例子:

    int data[numValues];
    vector<int> v;
    v.insert(v.begin(), data, data + numValues);
    

    使用vector的区间inster(),一行代码搞定。

    vector<int>::iterator insertLoc(v.begin());
    for (int i = 0; i < numValues; ++i) {
        insertLoc = v.insert(insertLoc, data[i]);
        ++insertLoc;
    }
    

    使用单元素的insert(),需要借助for循环来完成,并且在每次insert后需要返回迭代器和更新迭代器,因为vector是序列容器,在insert和delete时,会使迭代器失效,而对失效的迭代器进行操作,其行为是未知的。

    看,使用单元素函数比区间函数更麻烦,效率更低啊。

    总结一下区间insert比单元素insert的优势:

    • 1.前者调用一次完成任务, 后者调用numValues次,所以前者比后者快numValues-1次调用单元素insert的时间(当然,这只是明面的)
    • 2.每次insert,当vector不够内存时,会动态的申请更大的内存,然后做数据的搬移动作(涉及到拷贝构造函数和复制构造函数的调用),额外增加更多的拷贝对象副本的消耗
    • 3.后者比前者分配更多的内存,因为是一次一次的insert进去,所以势必会造成动态内存的申请,最后有可能造成,比区间函数调用分配的内存的两倍

    区间函数的分类:

    • 1.区间构造:
      container::container(InputIterator begin, InputIterator end);

    • 2.区间插入:
      标准序列容器:
      void container::insert(iterator position, InputIterator begin, InputIterator end);
      标准关联容器(因为是平衡树结构,内部自动调整平衡,不用提供potition参数):
      void container::insert(lnputIterator begin, InputIterator end);

    • 3.区间删除:
      标准序列容器:
      iterator container::erase(iterator begin, iterator end);
      标准关联容器(因为关联容器元素没有前后顺序关系,之间的迭代器无关联的,所以erase后不会影响迭代器,所以返回void即可):
      void container::erase(iterator begin, iterator end);

    • 4.区间赋值:
      void container::assign(InputIterator begin, InputIterator end);

    以后一定好好使用区间函数,写入优美的代码!!!

  • 相关阅读:
    Android Apk获取包名和Activity名称
    SoupUI接口测试学习分享
    Android 手机自动化测试工具有哪几种?
    SVN和CVS的区别
    名词
    本地解析地址步骤
    python3.6.1+selenium3.0环境安装问题及解决方法
    简述企业信息化与企业架构关系
    企业架构实践的线下公开课学习感悟
    golang 12.9 go mod 实践
  • 原文地址:https://www.cnblogs.com/liangjf/p/10159464.html
Copyright © 2011-2022 走看看