STL容器

作者: geaus | 来源:发表于2016-04-30 23:07 被阅读0次

    标准模板类库容器类有两种类型,分别是顺序和关联。顺序容器提供对其成员的顺序访问和随机访问,关联容器则经过优化关键值访问它们的元素。

    找出下面程序的错误:

    class CDemo{
        public:
          CDemo() : str(NULL);
          ~CDemo(){
              if(str) delete[] str;
          }
        public:
          char* str;
    }
    
    void main(){
        CDemo d1;
        d1.str=new char[32];
        strcpy(dl.str,"trend micro");
        vector<CDemo>* a1=new vector<CDemo>();
        a1->push_back(d1);
        delete a1;
    }
    

    这个程序的错误在于delete a1时,会销毁其中push的CDemo对象,而由于push_back(d1)时是浅赋值,即没有开辟新的内存保存d1.str的值,使得程序结束后,对d1.str执行了两次内存释放,造成delete同一片内存,程序崩溃。解决这个问题的方法是定义CDemo类的一个深复制构造函数。

    //像下面那样,当erase当前iterator指向的元素时,这个iterator就失效了,对其++或取值都会报错。
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    vector<int>::iterator it=v.begin();
    v.erase(it);
    it++;
    cout<<*it;
    

    下面的代码是使用函数指针完成给定的任务,利用静态模板类实现。

    #include <iostream>
    using namespace std;
    
    template<class T>
    class Operate{
        public:
        static T Add(T a, T b){
            return a+b;
        }
        static T Mul(T a, T b){
            return a*b;
        }
        static T Minus(T a, T b){
            return a-b;
        }
    }
    //使用时,如下
    int a=19, b=1;
    cout<<Operator<int>::Add(a,b);
    

    常用的STL容器:

    数据结构 描述 实现的头文件
    向量(vector) 连续存储的元素 <vector>
    列表(list) 由节点组成的双向链表 <list>
    双队列(deque) 连续存储的指向不同元素的指针所组成的数组 <deque>
    集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素拥有相同的次序 <set>
    多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>
    栈(stack) 后进先出的值的排列 <stack>
    队列(queue) 先进先出的值的排列 <queue>
    优先队列(priority_queue) 元素的次序是由作用于所存储的值决定的一种队列 <queue>
    映射(map) 由{键,值}对组成的集合,按键排序 <map>

    相关文章

      网友评论

          本文标题:STL容器

          本文链接:https://www.haomeiwen.com/subject/rimkrttx.html