第一部分的重点为语法糖,时空复杂度,stl容器等等,下面就简单介绍一下这些部分。
1. 语法糖
1.1 定义
语法糖是由英国计算机科学家彼得·约翰·兰达提出的一个术语,指的是编程语言中添加的某种语法,这种语法对语言的功能没有影响,但可以使代码更简洁、易读,或者更符合程序员的编程习惯。
1.2 auto关键字
auto主要作用是自动识别变量类型 注意使用auto定义变量时必须初始化,auto变量无法作为参数。
auto x = 10; // int
auto y = 1.1; // double
auto z = 'B' // char
当变量类型比较长时,auto自动识别变量类型,使代码变得简洁,有时候也能规避类型判断错误导致的精度错误。注意auto不能和指针结合,没有指针auto型。
auto a=1;b=3.1;
//这样是错误的,因为运用auto同一句语句两个成员必须为同样的类型。
auto a;
//这样子是错误的,auto必须初始化。
void swap(auto a)
//这是错误的,auto a不能作为参数
1.3 for循环
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误,因此 C++11 中引入了基于范围的for循环。范围 for 循环可以更简单地遍历顺序容器中的每一个元素。
支持数组, vector , deque , list , string 等支持顺序访问的容器。
#include <iostream>
using namespace std;
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
for (int l : a)
{
std::cout << l << ' ';
}
return 0;
}
注意在这里l不需要初始化
1.4 auto和for循环的结合
上文曾说,auto可以帮助判断类型,那么我们在for循环中初始变量l时,就可以用这种方法,将int用auto替换。
#include <iostream>
using namespace std;
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
for (auto l : a)
{
std::cout << l << ' ';
}
return 0;
}
1.5 using
可以作为命名空间的展开,比如
using namespace std;
还可以用来别名声明,比如
using int32 = long;
using int64 = long long;
using struct listnode=node;
2. 时空复杂度
2.1 时间复杂度
C++ 程序运行时,每条语句的耗时基本相同。故语句执行次数可以大致反映程序的运行时间。所以如果以一条语句运算时间为标准1,则n条语句运行时间则为n,这就是时间复杂度的来源。
void func2(int n)
{
for (int i = 1; i <= n; ++ i )
{
printf("@"); // 执行 n 次
}
}
该程序时间复杂度为n
int func5(int n) {
int i = 0, sum = 0;
while (sum <= n) {
i ++;
sum += i;
}
return sum;
}
该程序时间复杂度为根号n
2.2 空间复杂度
空间复杂度是衡量程序内存占用的量度,它是变量定义次数的化简结果,采用和时间复杂度
完全相同的记号和化简规则。
void func6(int n) {
int a; // 定义 1 次
char b[n]; // 数组含 n 个变量,定义 n 次
float c[n][n]; // 数组含 n^2 个变量,定义 n^2 次
}
3.STL
常用的数据结构:数组(array) , 链表(list), tree(树),栈(stack), 队列(queue), 集合(set),映射表(map), 根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种。