文章列表
顺序容器内的元素按其位置存储和访问。
标准库定义了三种顺序容器类型:vector、list和deque(双端队列,读“deck”)。
标准库还提供了三种容器适配器(adaptor)。包括stack、queue和priority_queue类型。
顺序容器
vector 支持快速随机访问
list 支持快速插入删除
deque 双端队列
顺序容器适配器
stack 后进先出(LIFO)栈
queu ...
IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于读写存储在内存中的string对象。在fstream和sstream里定义的每种类型都是从iostream头文件中定义的相关类型派生而来。
1.IO对象不可复制和赋值
ofstream out1,out2;
out1 = out2;//错误,IO对象不可以赋值
ofstream print(ofstream);//错误,IO对象不可以复制
return 0;
注意:只支持复制的元素类型可以存储在vector或其他容器类型里。由于 ...
1.函数的传递
形参的初始化与变量的初始化一样,如果形参是非引用类型,则复制实参的值;如果形参为引用类型,则它只是实参的别名。
(1)非引用形参
普通的非引用类型的参数通过复制对应的实参实现初始化,当用实参副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值。
注意:非引用形参表示对应实参的局部副本。对这类形参的修改仅仅改变了局部副本的值。一旦函数执行结束,这些局部变量的值也就没有了。
(2)非引用形参之指针形参
与其他非引用类型的形参一样,该类型的任何改变也仅仅作用于局部副本。如果函数将新指针值赋给形参,主调函数使用的实参指针的值没有改变。实参指针不改变 ...
1.箭头操作符
如果p是一个指向对象的指针,(*p).foo;等价于p->foo;
2.条件运算符
cond?expr1:expr2;
(1)避免使用条件运算符的深度嵌套
(2)在输出表达式中使用条件操作符
3.sizeof操作符
sizeof操作符的作用是返回一个对象或类名的长度,返回值类型为size_t。
对数组做sizeof操作符等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。
int sz = sizeof(ia)/sizeof(*ia);
4.逗号操作符
逗号表达式是一组由逗号分隔的表达式,这些表达式从左向右计算。
...
数组类型的变量有三个重要的限制:数组长度不变,在编译时必须知道其长度,数组只在定义它的语句块内存在。实际的程序往往需要动态的分配数组。虽然数组长度是固定的,但动态分配的数组不必在编译时知道其长度,可以(通常是)在运行时才确定数组长度,与数组变量不同,动态分配的数组将一直在,知道程序显式释放它为止。
C语言使用一对标准的函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new 和 delete 表达式实现相同的功能。
1.动态数组的定义
动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new 表达式返回新分配数组的第一个元素的指针。
int *pi ...
尽管C++支持C风格字符串,但是不应该在C++源程序中使用这个类型。C风格字符串常常带来许多错误,是导致大量安全问题的根源。
C风格字符串的使用
char ca1[] = {'c','+','+'};//不是C风格字符串
char ca2[] = {'c','+','+','\0'};//C风格字符串
char ca3[] = "c++";//C风格字符串
const char *cp = "C++";//C风格字符串
char *cp1 = ca1;//不是C风格字符串
char *cp2 = ca2;//C风格字符串
注意 ...
指针的概念:指针用于指向对象。与迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更通用一些。与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。
string s("hello");
string *sp = &s;
建议:尽量避免使用指针和数组
指针和数组容易产生不可预料的错误。指针用于低级操作,容易产生与繁琐细节相关的错误,现在C++程序采用vector类型和迭代器取代一般的数组,采用string类型取代C风格字符串。
1.指针变量的定义
vector<int> *pvec;
int *ip1, ...
低级符合类型:数组、指针
数组的长度是固定的。数据一经创建,就不允许添加新的元素。指针可以向迭代器一样便利和检查数组中的元素。现在C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。与使用标准的vector类型的程序相比,依赖于内置数组的程序更容易出错而且难于调试。
注意:数组定义中的类型名可以是内置数据类型或类类型;除引用之外,数组元素的类型还可以是任意的符合类型。没有所有元素都是引用的数组。
1.数组的定义和初始化
数组的维数必须要用大于等于1的常量表达式定义。此常量表达式只能包含整形字面值常量,枚举常量或者用常量表达式初始化的const对象,非 ...
标准库vector模板
- 博客分类:
- C++学习之旅
vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。vector成为容器,因为它能包含其他对象,所有对象必须是同一种类型。
#include<vector>
using std::vector;
注意:vector是一种类模板,不是一种数据类型,它可以来定义任意多种数据类型。如vector<int>和vector<string>都是数据类型。
1.vector对象的定义和初始化
(1)vector<T> v1; vector保存类型为T的对象。默认构造函数v1为空。
(2)vector<T& ...
标准库string类型
- 博客分类:
- C++学习之旅
string类型支持长度可变的字符串。
#include <string>
using std::string;
1.string对象的定义和初始化
(1)string s1; 默认构造函数,s1为空串
(2)string s2(s1); 将s2初始化为s1的 ...
头文件、预处理器、命名空间
- 博客分类:
- C++学习之旅
1.头文件用于声明而不是用于定义
extern int ival = 10; //初始化了,为定义,不适合放在头文件中
double dval; //没有extern,是定义,不适合放在头文件中
注意:避免防止多重定义链接错误。因为头文件包含在多个源文件中 ...
1.定义和初始化枚举
关键字enum
enum a{input,output,append};
默认地,第一个枚举成员赋值为0,后面的每个枚举成员赋的值比前面的大1。
2.枚举成员是常量
可以为一个或多个枚举成员提供初始值,用来初始化枚举成员的值必须是一个常量表达式。
enum Forms{shape=1,sphere,cylinder,polygon};
在枚举类型Forms中,显示将shape赋值为1。其他枚举成员隐式初始化:sphere初始化为2,cylinder初始化为3,polygon初始化为4
注意的是:枚举成员值可以是不唯一的。
enum points{ ...
const限定符和引用和typedef
- 博客分类:
- C++学习之旅
1.定义const对象
const int i=10;
变量i仍然是一个左值,但是现在这个左值是不可修改的,任何修改i的尝试都会导致编译出错。
2.const对象默认为文件的局部变量
非const变量默认为extern。要使const变量能够在其他的文件中访问,必须显示的指定它为extern。
3.引用
引用就是对象的另一个名字。在实际程序中,引用主要用作函数的形式参数。
引用是一种复合类型,通过在变量前添加“&”符号来定义。复合类型是指用其他类型定义的类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。
(1).引用是别名
引用只是绑定的对象 ...
变量的初始化、定义和声明
- 博客分类:
- C++学习之旅
1.C++支持两种初始化变量的形式:复制初始化和直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中:
int iVal(1024); //直接初始化
int iVall = 1024; //复制初始化
在C++中“初始化不是赋值”,初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。
2.变量的初始化规则
(1).内置类型变量的初始化
内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。未初始化变量引起的错误难以发现,永远不要依赖未定义行为。
建议每 ...