C++之 向量、模板和异常(一)

向量、模板和异常

STL容器vector的设计与实现。


问题

vector<double> vd; //double类型元素
for(double d; cin>>d;)
    vd.push_back(d); //扩展vd以容纳所有元素

vector<char> vc(100);  //char类型元素
int n;
cin>>n;
vc.resize(n); //令vc有n个元素

//读取元素存入一个vector中,不使用push_back:
vector<double>*p = new vector<double>(10);
int n = 0;
for (double d; cin>>d;)
{
    if (n==p->size())
    {
        vector<double>* q = new vector<double>(p->size()*2);
        copy(p->begin(), p->end(), q->begin());
        delete p;
        p = q;
    }
    (*p)[n] = d;
    ++n;
}
上面那的代码太麻烦了


我们希望容器能够根据用户的实际需求动态调整其大小。
vector<double> vd;
for (double d; cin>>d;) vd.push_back(d);

string是存储字符的容器。

map 是值对构成的树。


改变大小

vector<double> v(n) //v.size()=n

通过三种方法改变v的大小:
v.resize(10); //v现在有10个元素

v.push_back(7); //在v的末尾增加一个值为7的元素, v.size()递增1

v=v2;  // 赋值为另一个vector: v现在变为v2的一个副本   v.size()现在等于v2.size()

还有rease()和insert()的操作。


表示方式


class vector
{
    int sz; //元素数目
    double* elem; //首元素地址
    int space; //元素数加上用于新元素的("当前分配的")"空闲空间" / "槽位数"

public:
    //...
};

因此sz(元素数量)指向最后一个元素之后的位置,
space指向最后一个已分配单元之后的位置。

尾后元素完全是想象中的,默认构造函数不在空闲空间中分配内存,只占用最小的存储空间。


reserve和capacity

vector::reserve()
这一操作来为新元素增加内存空间。

void vector::reserve(int newalloc)
{
    if (newalloc<=space) return;  //永远不会减少分配的空间
    double* p = new double[newalloc]; //分配新空间
    for (int i=0; i<sz; ++i) //拷贝现有元素
    delete[] elem;
    elem = p;
    space = newalloc;
}


resize


push_back


void vector::push_back(double d)
//将vector的大小增加1:用d初始化新元素
{
    if (space==0)
        reserve(8);  //从8个元素开始
    else if (sz==space)
        reserve(2*space); //获取更多空间
    elem[sz] = d;   //将d添加到末尾
    ++sz;   //增加大小(sz为元素数
}


赋值

当赋值v1 = v2完成后,向量v1应该是向量v2的一个副本。

最简单的实现包括如下操作:
为副本分配存储空间
拷贝元素
释放原有已分配的空间
将sz elem space设置为新值


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值