Effective STL 条款3

确保容器中的对象拷贝正确而高效

在使用STL模板的时候,我们必须想到有关拷贝的问题。如果STL中存储的是我们自定义类型。可能会发生以下几个问题:

首先

为了避免拷贝过程成为程序运转的瓶颈,我们选择存储自定义的指针。但是,这里容易出现野指针的问题,所以我们需要使用智能指针shared_pre来避免。

接着

如果存储类型为基类,此时我们存储派生类,则会发生截断现象,即只copy了基类部分,而派生类部分丢失。

最后

相对于数组来说,vector有它独到的有点,最明显的就是长度的动态增长。

时间: 2024-11-14 15:42:08

Effective STL 条款3的相关文章

Effective STL 条款1:仔细选择你的容器

条款1:仔细选择你的容器 了解各种容器的实现方法,知道各种容器的内存管理方式.各种操作所对应的底层操作,然后根据需要选择恰当的容器. 对于容器的分类: 标准STL序列容器:vector,string,deque和list 标准STL关联容器:set,multiset,map和multimap 非标准序列容器:slist(单向链表)和rope(重型字符串--不懂) 非标准关联容器:hash_set,hash_multiset,hush_map和hash_multimap vector == str

effective stl 条款18:避免使用vector<bool>

做为一个STL容器,vector<bool>确实只有两个问题.第一,它不是一个STL容器.第二,它并不容纳bool.除此以外,就没有什么要反对的了 . 在这些要求中有这样一条:如果c是一个T类型对象的容器,且c支持operator[],那么以下代码必须能够编译:T *p = &c[0]; // 无论operator[]返回什么,// 都可以用这个地址初始化一个T*换句话说,如果你使用operator[]来得到Container<T>中的一个T对象,你可以通过取它的地址而获得

effective stl 条款15 小心string实现的多样性

实际上每个string实现都容纳了下面的信息: ● 字符串的大小,也就是它包含的字符的数目. ● 容纳字符串字符的内存容量.(字符串大小和容量之间差别的回顾,参见条款14.) ● 这个字符串的值,也就是,构成这个字符串的字符 另外,一个string可能容纳 ● 它的配置器的拷贝.对于为什么这个域是可选的解释,转向条款10并阅读关于这个古怪的管理分配器的规则.依赖引用计数的string实现也包含了 ● 这个值的引用计数 ● string对象的大小可能从1到至少7倍char*指针的大小.● 新字符串

More Effective C++ 条款35 让自己习惯于标准C++ 语言

(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用) 1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发的类型晋升转换,以及"在class 定义区内直接为整数型(intergral) const static class members设定初值"的能力. 2). 扩充了Templates的特性

Effective STL 中文版(大全)

Effective STL 中文版(大全) 作者:winter 候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL.Effective STL是一本非常好的书,帮助你更好的理解STL,其作者就是<Effective C++>一书的作者.如果你已经初步了解了STL的容器.迭代器.算法和函数,而又想更好的了解STL,那么<Effective STL>是你的最佳选择. 还有一部分没有找到链接,如果再找不到我会自己试着翻译一下:) 前言 容器 条款1

迅速读懂:Effective STL (五)

这是<Effective STL>笔记最后一期,不能涵盖全部内容,书后仍然有些附加内容,不在附加,有兴趣可以找原书来读读,一则是区域设置后的忽略大小写比较,另一则是MSVC4-5编译器下STL注意事项 条款41:了解使用ptr_fun.mem_fun和mem_fun_ref的原因 函数和函数对象总使用用于非成员函数的语法形式调用.mem_fun带有一个到成员函数的指针,pmf,并返回一个mem_fun_t类型的对象.这是一个仿函数类,容纳成员函数指针并提供一个operator(),它调用指向在

Effective C++ 条款四 确定对象被使用前已被初始化

1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成.      int x = 0;      const int * p = &x; 3.不要混淆赋值与初始化的区别.一般初始化在定义的时候一起进行.而赋值是在定义之后的动作.      比如说在某一个类中的构造函数中,函数的行为都是赋值操作,而非初始化操作.      一般来说,对象的成员变量的初始化动作发生在进入构造函数本体之前.所以,我们一

effective c++ 条款4 make sure that objects are initialized before they are used

1 c++ 类的数据成员的初始化发生在构造函数前 class InitialData { public: int data1; int data2; InitialData(int a, int b) { data1 = a: //this is assignment data2 = b; //this is assignment } /* InitialData(int a, int b):data1(a),data2(b) //this is initial {} */ } 2 不同cpp文

More Effective C++ 条款34 如何在一个程序中结合C++和C

1. C++和C混合使用的前提之一就是编译器产生兼容的目标文件(.lib和.dll等).所谓"兼容",指的是编译器在"预编译器相依的特性上"一致,如int和double大小,参数压栈机制等,只有在这个基础上才能讨论结合使用C++和C模块的问题. 2. 在1的基础上,要结合使用C++和C的模块,主要有以下几点需要注意: 1). name mangling(名称重整) Name mangling是C++用于支持函数重载的机制,它对重载的函数名称进行一定改变,使得每个函数