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
泛型编程
模板
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《程序员面试宝典》