zoukankan      html  css  js  c++  java
  • 【基础复习】五:STL模板与容器


    vector容器

    Class A d;
    vector<ClassA> *a = new vector<ClassA>();
    a->push_back(d);
    delete a;
    

    解析:
    在这里要注意的是,a里的ClassA元素和d是不同的对象,push_back的语句实际上是调用了ClassA的复制构造函数。如果ClassA中没有定义复制构造函数,编译器会为ClassA类构造一个默认的复制构造函数(浅复制)。如果类中的数据成员涉及到指针,浅复制会导致两个对象中的指针指向同一块内存,最后调用析构函数的时候,可能导致同一块内存被释放两次,引起程序崩溃。因此在这里要注意深复制和浅复制


    2.vector的迭代器 `vector::iterator itor;`,如果删除迭代器所指向的这个元素`vec.erase(itor)`,元素删除后,迭代器会指向到后面一个元素上。

    泛型编程

    概念
    普通函数改写成泛型函数

    模板

    1.试用多态实现线性表(队列、串、堆栈),要求具备线性表的基本操作:插入、删除、测长等。

    #include<iostream>
    #include<cstdlib>
    using namespace std;
    
    template<typename t>
    struct tcontainer
    {
        virtual void push(const t&) = 0;
        virtual void pop() = 0;
        virtual const t& begin() = 0;
        virtual const t& end() = 0;
        virtual size_t size() = 0;
    };
    
    template<typename t>
    struct tvector:public tcontainer<t>
    {
        static const size_t _step = 100;
        tvector () {
            _size = 0;    //初始化vector实际大小
            _cap = _step; //vector容量为100
            buf = 0;      //首地址,需要动态分配内存
            re_capacity(_cap);  //此时buf为空,即要设置buf初始值
        }
    
        ~tvector() {
            free(buf);
        }
    
        void re_capacity(size_t s) {
            if (!buf)
                buf = (t*)malloc(sizeof(t)*s);
            else
                buf = (t*)realloc(buf, sizeof(t)*s);
        }
    
        virtual void push(const t& v) {
            if (_size >= _cap)
                re_capacity(_cap+=_step);
            buf[_size++] = v;
        }
    
        virtual void pop() {
            if (_size)
                _size--;
        }
    
        virtual const t& begin() {
            return buf[0];
        }
    
        virtual const t& end() {
            if (_size)
                return buf[_size-1];
        }
    
        virtual size_t size() {
            return _size;
        }
    
        const t& operator[] (size_t i) {
            if (i >= 0 && i < _size)
                return buf[i];
        }
    
        private:
        size_t _size; //实际元素个数
        size_t _cap; //已分配的容量
        t* buf;
    };
    
    int main() {
        tvector<int> v;
        for (int i = 0; i < 1000; ++i)
            v.push(i);
        for (int i = 0; i < 1000; ++i)
            cout << v[i] << endl;
    }
    



    from《程序员面试宝典》



  • 相关阅读:
    bzoj 4260 Codechef REBXOR——trie树
    bzoj 2238 Mst——树链剖分
    bzoj 2836 魔法树——树链剖分
    CF 888E Maximum Subsequence——折半搜索
    bzoj 4289 PA2012 Tax——构图
    bzoj 4398 福慧双修——二进制分组
    bzoj1116 [POI2008]CLO——并查集找环
    bzoj4241 历史研究——分块
    bzoj4373 算术天才⑨与等差数列——线段树+set
    bzoj4034 [HAOI2015]树上操作——树链剖分
  • 原文地址:https://www.cnblogs.com/zengyh-1900/p/5245249.html
Copyright © 2011-2022 走看看