STL常见问题工具书是今年最新最全的工具资料内容,是编程人员在从事工作期间必须要用到的一些东西,有了它你的工作可以更加轻松,每天的工作时间会大大缩短,让你的编程从此更加厉害,需要的下载吧。
STL常见问题工具书说明:
Q:以下两种定义方式,在进行map.clear()的时候,内存释放上有啥不同?
typedef map<CString,CFileAttribute> MAPStr2FileAttr;
typedef map<CString,CFileAttribute *> MAPStr2FileAttr;
A:clear()相当于earse(m.begin(), m.end());
若定义的map的存储对象是一个类对象:
拷贝是整个STL(Standard Template Library,标准模板库)工作的方式,所以容器中保存的是副本,而不是要添加的对象本身。对象原件在副本拷贝存放结束后便可以结束生命,而在使用clear()的时候,对象副本会去走到析构函数,进行对象内部的内存释放。clear()后,对象拷贝被析构,剩下的只是raw memory,即没有被初始化的内存,它们将被归还到stl的内存分配器alloc里的(记得吗,vector/list等所有容器都有一个alloc参数的,就是这东西),容器本身已经不再拥有这块内存了。内存归还了,只不过不是归还入系统堆而已。(除了vector不能(自动)释放内存,其它STL容器都会在每一个erase动作后释放一块内存。)
若定义的map存储对象是一个类对象的指针:
这时一般不能采用clear()函数,因为clear()不会自动释放原来对象所占用的内存。这时可以使用erase()辅助delete语句进行元素删除和内存释放。
上面这句话我是这样理解的,因为存入的是指针,这个指针指向一块区域(new出来的,eg:class A, A *a = new A()),但是毕竟map里面的value值是个指针,就是一个地址而已,因此在clear的时候只是把指针清除掉了,而指针指向的内容依旧存在。因此一般要在clear之前先释放掉这些个指针指向的空间。
另外使用的是类对象指针时,还需要维护这个指针不受到破坏。
小结:
如果用容器存副本,则容器销毁的时候,副本也会自动被删除。
如果用容器存指针,则容器销毁的时候,不会删除这些指针所指向的对象,因此必须先手工删除完毕之后,再销毁容器。
Q: 对由key得到的value对象,没有办法改变其中的数值吗??
例如下代码:
//srcfileAttribute.nIndex初始为0
CFileAttribute srcfileAttribute = m_mapKeyVsFile[“abc”];
srcfileAttribute.nIndex++;
但是再次CFileAttribute srcfileAttribute = m_mapKeyVsFile[“abc”];
发现这个srcfileAttribute.nIndex还是0;并没有变成1,
这是为什么呢??
难道说我不能这样直接改map里面的value值吗?必须删除重新insert一个??
A:srcfileAttribute = m_mapKeyVsFile[“abc”];此时srcfileAttrbute是通过map中值的拷贝构造函数构造的一个新的对象,这个副本的改变不影响map中的值,要改变map中的值可以直接m_mapKeyVsFile[“abc”].nIndex++;
如果用容器存副本,其存入、取出的过程是通过拷贝构造函数 和 赋值操作符来进行的。
关于STL:
STL(Standard Template Library)标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什么。
- PC官方版
- 安卓官方手机版
- IOS官方手机版