《C++ Primer》第9章 9.4节习题答案

《C++ Primer》第9章 顺序容器

9.4节vector对象是如何增长的 习题答案

练习9.35:解释一个vector的capacity和size有何区别。

【解答】

capacity返回已经为vector分配了多大内存空间(单位是元素大小),也就是在不分配新空间的情况下,容器可以保存多少个元素。而size则返回容器当前已经保存了多少个元素。

练习9.36:一个容器的capacity可能小于它的size吗?

【解答】

由上一题解答可知,这是不可能的。

练习9.37:为什么list或array没有capacity成员函数?

【出题思路】

理解list和array与vector在数据结构上的差异导致内存分配方式的不同。

【解答】

list是链表,当有新元素加入时,会从内存空间中分配一个新节点保存它;当从链表中删除元素时,该节点占用的内存空间会被立刻释放。因此,一个链表占用的内存空间总是与它当前保存的元素所需空间相等(换句话说,capacity总是等于size)。而array是固定大小数组,内存一次性分配,大小不变,不会变化。因此它们均不需要capacity。

练习9.38:编写程序,探究在你的标准库实现中,vector是如何增长的。

【解答】

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vi;
    unsigned long s, c;
    for(s = vi.size(), c = vi.capacity(); s <= c; s++)
        vi.push_back(1);
    cout << "1空间:" << vi.capacity() << "元素数:" << vi.size() << endl;
    for(s = vi.size(), c = vi.capacity(); s <= c; s++)
        vi.push_back(1);
    cout << "2空间:" << vi.capacity() << "元素数:" << vi.size() << endl;
    for(s = vi.size(), c = vi.capacity(); s <= c; s++)
        vi.push_back(1);
    cout << "3空间:" << vi.capacity() << "元素数:" << vi.size() << endl;
    for(s = vi.size(), c = vi.capacity(); s <= c; s++)
        vi.push_back(1);
    cout << "4空间:" << vi.capacity() << "元素数:" << vi.size() << endl;
    for(s = vi.size(), c = vi.capacity(); s <= c; s++)
        vi.push_back(1);
    cout << "5空间:" << vi.capacity() << "元素数:" << vi.size() << endl;

    return 0;
}

运行结果:

 练习9.39:解释下面程序片段做了什么:

vector<string> svec;
svec.reserve(1024);
string word;
while(cin >> word)
   svec.push_back(word);
svec.resize(svec.size() + svec.size() / 2);

【出题思路】

继续熟悉vector空间分配。

【解答】

首先,reserse为svec分配了1024个元素(字符串)的空间。随后,循环会不断读入字符串,添加到svec末尾,直至遇到文件结束符。这个过程中,如果读入的字符串数量不多于1024,则svec的容量(capacity)保持不变,不会分配新的内存空间。否则,会按一定规则分配更大的内存空间,并进行字符串的移动。接下来,resize将向svec末尾添加当前字符串数量一半那么多的新字符串,它们的值都是空串。若空间不够,会分配足够容纳这些新字符串的内存空间。

练习9.40:如果上一题中的程序读入了256个词,在resize之后容器的capacity可能是多少?如果读入了512个、1000个或1048个词呢?

【解答】

根据上题解答中对程序的分析:若读入了256个词,则resize之后容器的capacity将是384(假定使用tdm-gcc4.8.1)。若读入了512个词,则resize之后容器的capacity将是768。若读入了1000个词,则resize之后容器的capacity将是2048。若读入了1048个词,则resize之后容器的capacity将是2048。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<string> svec;
    vector<string> svec2;
    vector<string> svec3;
    vector<string> svec4;
//    svec.resize(1024);
//    string word;
    cout << "capacityp=====" << svec.capacity() << "         size===" << svec.size()<<endl;


//    while(cin >> word)
    for(int i = 0; i < 256; i++)
    {
        svec.push_back("wrold");
    }
    svec.resize(svec.size() + svec.size() / 2);
    cout << "capacityp=====" << svec.capacity() << "          size===" << svec.size() <<endl;

    for(int i = 0; i < 512; i++)
    {
        svec2.push_back("wrold");
    }
    svec2.resize(svec2.size() + svec2.size() / 2);
    cout << "capacityp=====" << svec2.capacity() << "          size===" << svec2.size() <<endl;

    for(int i = 0; i < 1000; i++)
    {
        svec3.push_back("wrold");
    }
    svec3.resize(svec3.size() + svec3.size() / 2);
    cout << "capacityp=====" << svec3.capacity() << "          size===" << svec3.size() <<endl;

    for(int i = 0; i < 1048; i++)
    {
        svec4.push_back("wrold");
    }
    svec4.resize(svec4.size() + svec4.size() / 2);
    cout << "capacityp=====" << svec4.capacity() << "          size===" << svec4.size() <<endl;
    return 0;
}

 运行结果:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值