【基础复习】五: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《程序员面试宝典》



原文地址:https://www.cnblogs.com/zengyh-1900/p/5245249.html