标准模板
auto_ptr 是一个模板类,用于管理动态内存分配的方法。
auto_ptr 模板定义了类似指针的对象,可以把new 获得的地址赋给这种对象。当对象auto_ptr 过期时,其中的析构函数会释放这个指针的内容。
例如:
auto_ptr<double> pd;
double *p_reg = new double;
pd = auto_ptr<double> (p_reg);
auto_ptr<double>pauto (p_reg);
注意:
只能对new 分配的内存使用auto_ptr 对象,而不要对由new[] 分配的或者通过声明变量分配的内存使用它。
赋值使用:
auto_ptr<string> ps (new string("I am regined lonely as a clond "));
auto_ptr<string> vocation;
vocation = ps;
当vocation 和 ps 都是常规指针的则两个指针最后都指向了统一个地方,但是我们需要知道,最后指针过期的时候都需要删除,这样就会删除一个对象两次,所以这是人为BUG;
为了避免这种问题:
定义赋值操作符,使之执行深复制。即将目标复制使他们指向两个地址。
建立所有权概念,对与特定对象,只能有一个只能指针指向它。创建智能更高的指针,跟踪引用特定对象的智能指针数,就是引用计数,仅当最后一个指针过期时,delete 才会被调用。
STL 简要说明
STL 是一种通用的编程技术。面向对象编程关注的是编程的数据方面,而STL则关注的是算法,他们之间的共同点是抽象和创建可重用代码,但是理念绝对是不同的。
迭代器:
关于迭代器的一些特征要求:
1.能够进行解引用,应对解引用定义
2.能够将一个迭代器赋值给另一个
3.能够将迭代器与另一个进行比较
4.能够使用迭代器遍历容器中所有的元素
迭代器类型:
1.输入迭代器:单向迭代器,可以递增但是不能倒退。
2.输出迭代器:单向迭代器,只能写不能读。
3.正向迭代器:可以读取和修改数据,也可以使得只能读取数据,具有多次通行性
4.双向迭代器:具有正向迭代器的所有特性,并且可以回退
5.随机访问迭代器:支持随机访问操作
容器的分类
1.序列
可以通过添加要求来改进基本的容器概念,其中6种容器都是序列的,deque,list,queue,priority_queue,stack,vector 都是序列的,学历概念增加了迭代器至少是正向的迭代器这样的要求。
这里有序列的可选要求
返回类型 含义 容器
a.front() T& *a.begin() vector,list,deque
a.back() T& *--a.end() vector,list,deque
a.push_front(t) void a.insert(a.begin(),t) list,deque
a.push_back(t) void a.insert(a.end(),t) vector,list,deque
a.pop_front(t) void a.erase(a.begin()) list,deque
a.pop_back(t) void a.erase(--a.end()) vector,deque
a[n] T& *(a.begin()+n) vector,deque
a.at(t) T& *(a.begin()+n) vector,deque
2.联合容器
是对容器概念的另一种改进。联合容器将值与关键字关联在一起,使用关键字来查找值。它的长处在于,它提供了对元素的快速访问,与序列相似,联合容器也允许插入元素但是不能指定位置,因为他们的位置一般都和算法有关。
3.操作符和相应的函数符
操作符 相应的函数符 操作符 相应的函数符
+ plus > greater
- minus < less
* multiplies >= greater_equal
/ divides <= less_equal
% modulus && logical_and
- negate || logical_or
== equal_to ! logical_not
!= not_equal_to
查看原文:http://zmrlinux.com/2016/02/02/c-%e9%80%9a%e7%94%a8%e7%bc%96%e7%a8%8b/