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

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

** 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);

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

原文地址:https://www.cnblogs.com/liangjf/p/10159464.html

时间: 2024-08-07 21:38:22

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

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

尽量使用区间成员函数代替它们的单元素兄弟的理由 一般来说使用区间成员函数可以输入更少的代码. 区间成员函数会导致代码更清晰更直接了当. 当处理标准序列容器时,应用单元素成员函数比完成同样目的的区间成员函数需要更多地内存分配,更频繁地拷贝对象,而且/或者造成多余操作. // 把一个int数组拷贝到vector前端 int data[numValues]; // 假设numValues在其他地方定义vector<int> v; ... // 区间成员函数版本 v.insert(v.begin(),

STL区间成员函数及区间算法总结

STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间成员函数不适用的情况下也应该使用区间算法,至少,相比手写循环而言,它更加简单,有效,并且不容易出错: 区间成员函数 区间构造 标准容器都支持区间构造函数: container::container(InputIterator begin, // 区间的起点 InputIterator end); /

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

 例子:使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(ve

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

set--常见成员函数及基本用法

c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器. set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素 2

条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》

条目二十八<正确理解由reverse_iterator的base()成员函数所产生的iterator的用法> 迭代器的种类一共有四种,上面已经说过了.这里就不再次写出来. 这一个条目主要是reserce_iterator和iterator的转换.可以使用base()函数来把前者转换为后者. 比如在拥有reserve_iterator,但需要用到插入,删除成员函数,那么这两个是不接受reserve_iterator作为参数的,所以需要转换为iterator再进行下一步的插入和删除元素. 以上代码

第五周项目1-体验常成员函数

设计平面坐标点类,计算两点之间距离.到原点距离.关于坐标轴和原点的对称点等.在设计中,由于求距离.求对称点等操作对原对象不能造成任何改变,所以,将这些函数设计为常成员函数是合适的,能够避免数据成员被无意更改. /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:邵帅 * 文件:Demo.cpp * 完成时间:2015年04月08日 * 版本号:v1.0 */ #include <iostream> #include <

第五周 项目一-体验成员函数

问题 设计平面坐标点类,计算两点之间距离.到原点距离.关于坐标轴和原点的对称点等.在设计中,由于求距离.求对称点等操作对原对象不能造成任何改变,所以,将这些函数设计为常成员函数是合适的,能够避免数据成员被无意更改. 代码 #include <iostream> #include <Cmath> using namespace std; class CPoint { private: double x; // 横坐标 double y; // 纵坐标 public: CPoint(d

C++STL(vector,map,set,list)成员函数整理

/ *最近ACM比赛,用到的时候忘记成员函数了,贼尴尬,给以后比赛做下准备 */ LIST: 构造函数 list<int> c0; //空链表 list<int> c1(3); //建一个含三个默认值是0的元素的链表 list<int> c2(5,2); //建一个含五个元素的链表,值都是2 list<int> c4(c2); //建一个c2的copy链表 list<int> c5(c1.begin(),c1.end()); ////c5含c1一