C++ primer中的一些概念和编程时应注意的问题
来源:互联网 发布:在北大读书的体验知乎 编辑:程序博客网 时间:2024/06/07 21:08
1、选择容器的一些法则:
(a)如果程序要求随机访问元素,则应使用vector或deque容器。
(b)如果程序必须在容器的中间位置插入或删除元素,则应采取list容器
(c)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用deque容器
(d)如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将
元素读入到一个list容器,接着对此容器重新排序,使其适合随机访问,然后将排序后的list容器复制到
一个vector容器。
note:通常来说,除非找到选择使用其他容器的更好的理由,否则vector容器都是最佳选择!!
2、容器适配器的概念
标准库提供了三种顺序容器适配器:queue、priority_queue、和stack。适配器(adaptor)是标准库中
通用的概念,包括容器适配器、迭代适配器和函数适配器。本质上,适配器是使事物的行为类似于另一
事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现
。例如,stack(栈)适配器可使任何一种顺序容器以栈的方式工作。
3、适配器满足的约束
stack适配器所关联的基础容器可以使任意一种顺序容器类型。因此,stack栈可以建立在vector、list、或
者deque容器之上。而queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list
容器上,而不能建立在vector容器上。priority_queue适配器要求提供随机访问功能,因此可建立在vector
或deque容器上,但不能建立在list容器上。。
4、关联容器
关联容器和顺序容器的本质差别在于:关联容器通过key(键)存储和读取元素,而顺序容器则通过
元素在容器中的位置顺序存储和访问元素。
map类型是键-值对的集合。map类型通常可理解为关联数组:可使用键作为下标来获取一个值,正如内
置数组类型一样。而关联的本质在于元素的值与某个特定的键值相关联,而并非通过元素在数组中的位置
来获取。
set类型只是单纯的键的集合。当只想知道一个值是否存在时,使用set容器是最合适的。例如:一个航空
公司使用set容器记录曾经给本公司发空头支票的客户。
5、对于构造函数初始化列表什么时候使用问题?
有些成员必须在构造函数初始化列表中进行初始化。对于这样的成员,在构造函数函数体重对他们
赋值不起作用。没有默认构造函数的类类型成员,以及const或引用类型的成员,不管是哪种类型,
都必须在构造函数初始化列表中进行初始化!!!
必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式!!
6、重载操作符简介
重载操作符是一些函数,其名字为operator后跟着所定义的操作符。因此,通过定义名为operator=的函数
,我们可以对赋值进行定义。像任何其他函数一样,操作符函数有一个返回值和一个形参表。形参表必须
具有与该操作符操作数数目相同的形参(如果操作符是一个成员,则包括隐式this形参)。赋值时二元运算
,所以该操作符函数有两个形参:第一个形参对应着做操作数,第二个形参对应着右操作数。
大多数的操作符可以定义为成员函数或非成员函数。当操作符为成员函数时,它的第一个操作数隐式绑定
到this指针。有些操作符(包括赋值操作符)必须是定义自己的类的成员。因为赋值必须是类的成员,所以
this绑定到指向左操作数的指针。因此,赋值操作符接受单个形参,且该形参是同一类类型的对象。
(2)重载一元操作符如果作为成员函数就没有(显示)形参,如果作为非成员函数就有一个形参。类似的,重载
二元操作符定义为成员时有一个形参,定义为非成员函数时有两个形参。
(3)一般将算数和关系操作符定义为非成员函数,而将赋值操作符定义为成员
(4)操作符定义为非成员函数时,通常必须将他们设置为所操作类的友元。因为在这种情况下,操作符
通常要访问类的私有部分。
(5)操作符定义的一些指导原则,有助于决定将操作符设置为类成员还是普通非成员函数:
- 赋值(=)、下标([ ])、调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。
- 像赋值一样,复合赋值操作符通常应定义为类的成员。与赋值不同的是,不一定非得这样做,如果定义非成员复合赋值操作符,不会出现编译错误。
- 改变对象状态或与给定类型紧密联系的其他一些操作符,如自增、自减或解引用,通常应定义为类成员。
- 对称的操作符,如算术操作符、相等操作符、关系操作符、和位操作符,最好定义为普通非成员函数
- C++ primer中的一些概念和编程时应注意的问题
- C/C++编程中的一些概念问题
- 一些c语言学习新手应注意的问题
- ++和——在c语言中应注意的一些小问题
- qt编程信号和槽连接应注意的问题
- 相变冷却系统应注意的一些问题
- 并行编程中应注意的问题
- 学编程应注意的问题
- 变压器空载合闸过程中的和应涌流及应注意的问题
- C++中需要注意的一些概念(primer)
- C,C++程序员使用C#应注意的一些小问题[1]
- C,C++程序员使用C#应注意的一些小问题[2]
- C,C++程序员使用C#应注意的一些小问题[3]
- C,C++程序员使用C#应注意的一些小问题[4]
- C,C++程序员使用C#应注意的一些小问题[5]
- C,C++程序员使用C#应注意的一些小问题
- pthread_create()和pthread_atfork()函数使用时应注意的问题
- 应注意的问题
- 机器学习知识导入
- Vijos-谁拿了最多的奖学金
- 斯皮尔曼等级相关
- 【连通图|强连通分量+dfs】POJ-3160 Father Christmas flymouse
- Git学习笔记
- C++ primer中的一些概念和编程时应注意的问题
- html5 进度条效果<progress>
- 安卓第二记
- Python中任意函数参数问题
- java 抓取网页图片并保存
- Ubuntu14.4 及 对应 VBox 和 扩展包 下载
- Gson简要使用笔记
- 数据结构之队列
- 黑马程序员---------Java基础-面向对象、设计模式