《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;
}
运行结果: