5.1.从C到C++
## 5.1.1C++框架
1.在C头文件之前加一个 c 然后去掉 .h 后缀
#include<iostream>
iostream提供了输入输出流
#include<algorithm>
algorithm提供了一些常用的算法。
while(cin >> a >> b)
从标注输入中读取 a ,返回值是一个 “已经读取了 a 的新流”,然后从这个新流中继续读取 b,如果流已经读完,while循环将退出。
(但缺点是运行太慢。输入量很大时不要用C++的流输入。)
using namespace std;
简化输入输出操作。使其存在于 名称空间std 中(用 cin 代替 是 std::cin …)。在工程上不推荐这样做。
声明数组时,数组大小可以用 const 声明的常数。
C++中多了用 bool 来表示布尔值,用 true 和 false 来表示真假。
5.1.2.引用
引用功能上比指针弱,但减少了出错的可能提高了代码的可读性。
在参数名前面加上 “&” 就表示这个参数按照引用的方式传递,而不是传值方式传递。这样,在函数内改变参数的值,也会修改到函数的实参。
5.1.3.字符串
C++中提供了新的 string 类型用来替代 C 中的字符数组。
string 头文件中定义了 string 类型,直接支持流式读写。但速度有些慢。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string line;
while(getline(cin, line)) { \\读取一行数据
int sun = 0, x;
stringstream ss(line); \\创建字符串流读取ss
while(ss >> x) sum += x;
cout << sum << "\n";
}
return 0;
}
string 很慢, sstream 更慢,应谨慎使用。
5.1.4.再谈结构体
C++ 不再需要用 typedef 的方式定义一个 struct 。
且在 struct 里除了可以有变量(成员变量)之外还可以有函数(成员函数)。
[ 工程中 一般用 struct 定义纯数据的类型,只包含较少的辅助成员函数。而 class 定义拥有复杂行为的类型。]
没有返回值的函数称为 构造函数。在声明变量时使用。
struct Point {
int x, y;
Point(int x = 0, int y = 0 : x(x), y(y) {}
// Point(int x = 0, int y = 0) {this->x = x; this->y = y }
};
“ = 0 ” 指 0 为默认值。也就是 Point()相当于 Point(0,0)。
“ :x(x), y(y) ” 表示成员变量 x 的初始化为参数 x ,成员变量 y 初始化为参数 y 。
“ this " 为指向当前对象的指针。“ this-> x” 等价于 “(*this).x” 为当前对象的成员变量 x 。
5.1.5.模板
5.2.STL初步
5.2.1.排序与检索
sort 使用数组元素默认的大小比较运算符进行排序,只有在需要按照特殊依据进行排序时才要传入额外的比较函数。
sort 可以给任意对象排序,包括内置类型和自定义类型。前提是类型定义了 “<” 运算符。
unique 函数可以删除有序数组中的重复元素。
5.2.2.不定长数组 vector
若 a 是一个 vector 。
a.size() 可读取它的大小。 a.resize() 可改变它的大小。 a.push_back() 可向尾部添加元素。 a.pop_back() 可删除最后一个元素。
vector<int>a //类似于int a[] 的整数数组
vector<double>b
声明一个vector。
vector 是一个模板类,可以直接赋值,可作为函数的参数或返回值。
5.2.3.集合 set
每个元素最多出现一次。自定义类型可以构造 set 但必须定义“小于”运算符。
set 中元素是按照从小到大排序的。
for(set<string>::iterator it == dict.begin(); it != dict.end(); ++it)
//元素的遍历
iterator 迭代器。用法类似于指针。
begin 和 and 是仿照STL中迭代器命名的。
5.2.4.映射 map
map 是键到值的映射。重载了 [] 运算符。也称为:关键数组。
map<string,int>month_name //月份名字到月份编号
month_name["July"] = 7 //赋值
两者都支持 insert、find、count、remove 操作,且可以按照从小到大的顺序遍历其中的元素
5.2.5. 栈、队列与优先队列
STL的栈定义在头文件中,可以用 stacks 声明一个栈。