STL学习笔记-容器的共性机制

容器的共通的能力:
(1) C++容器都是使用C++模板进行实现的。
(2) 理论提高:所有容器提供的都是值语意,而不是引用语意。容器执行插入元素的操作时,内部实现的是拷贝动作。
所以STL容器内部存储的元素必须能够被拷贝,即必须提供拷贝构造函数。即提供无参构造函数、拷贝构造函数、重载=操作符。
(3) 除了stack 和 quene外,每个容器都提供可返回迭代器的函数,用迭代器就可以访问元素
(4) 通常STL不会出现丢出异常,要求使用者确保传入正确的参数
(5) 每个容器都提供了一个默认构造函数和默认拷贝构造函数
如已有vecIntA,则vector<int> vecIntB(vecIntA) 调用的是拷贝构造函数,复制vecIntA到vecIntB中
(6) 与大小相关的操作方法:
container.size()  container.empty()
(7)容器的比较操作
c1==c2
c1 != c2
c1 = c2 //c2所有元指派给c1

案例:
class Student{
public:
    char * p_mname;
    int mage;
    Student(char * name, int age){
          p_mname = new char[strlen(name)+1];
          strcpy(p_mname, name);
           mage  = age;
     }
    ~Student(){
        if(p_mnae! = null){
              delete[] p_mname;
              p_mname = null;
              mage = 0;
         }
     }
    prinT(){
        cout<<p_mname<<" : " << mage<,endl;
     }

      // Student st2  = st1;
     //解决浅拷贝问题,重写拷贝构造函数
     Student( const Student & obj){
           p_mname = new char[strlen(obj.p_mname)+1];
           strcpy(p_mname, obj.p_mname);
           mage  = obj.mage;
     }   
    // st3 = st2 = st1 返回值必须是引用
    //重载 = 操作符
    Student& operator=(const Student & obj){
          //先把st2的旧内存释放掉      
          if(p_mname! = null){
              delete[] p_mname;
              p_mname = null;
              mage = 0;
         }
          //根据st1的大小分配内存
          p_mname = new char[strlen(obj.p_mname)+1]; 
          //copy st1的数据      
         strcpy(p_mname, obj.p_mname);
         mage  = obj.mage;

         return *this;
     }
};

void main(){
    Student st1("zhang min", 32);
    vector<Student> v1;
    v1.push_back(st1);  //此处会报错 深拷贝和浅拷贝的问题 C++默认的拷贝函数是浅拷贝, 解决方法见深色部分
}

各种容器的使用时机:
(1) deque使用场景: 比如排队购票系统, 支持头部的快速移除和尾部的快速添加。如果使用vector则头部移除时,会有大量的数据移动,速度慢。
(2) deque和vector的比较:
         vector.at()比deque.at()快,以为vector.at(0)是固定的,而deque的开始位置是不固定的
          有大量释放的时候,vector花的时间少,这和内部实现有关
          deque支持头部的快速移除和插入,这是其优点
(3) list使用场景: 比如公交车乘客的存储,随时有乘客上下车,支持频繁的不确定位置的插入和移除
(4) set使用场景:比如手机游戏中个人得分记录的存储,存储要求从高分到低分的顺序排列
(5) map的使用场景:比如按ID号存储10w个用户,快速通过ID查找对应用户信息。二叉树的效率很高,这就体现出来了。如果是vector,最坏的情况是遍历完整个容器才能找到。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值