向量、模板和异常
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设置为新值
、