序言
零散知识点复习
1. static的作用
[1] C语言中的static
全局静态变量
局部静态变量
静态函数
全局静态变量
【1】该变量在全局数据区分配内存
【2】未初始化的静态全局变量程序会自动初始化为0
【3】静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的
局部静态变量
【1】该变量在全局变量区分配内存
【2】静态局部变量在所处模块在初次运行时进行初始化工作,且只操作一次
【3】如果没有显示初始化,在编译期会自动初始化为0
【4】作用域为定义它的函数或语句块,但一直在全局数据区,生存期直到程序运行结束
静态函数
【1】静态函数只能在本源文件中使用
【2】其他文件中可以定义相同名字的函数,不会发生冲突
【3】在文件作用域中声明的inline函数默认为static
[2] C++中的static
静态数据成员
静态成员函数
静态数据成员
【1】对非静态数据成员,每个类对象都有自己的拷贝;但静态数据成员,无论定义了多少个对象,静态数据成员在程序中都只有一份,由所有对象共享访问,不属于特定的类对象,在没有产生类对象时就可以操作它
【2】静态数据成员主要用在各个对象都有相同的某个属性时,只要改变一次,所有对象的该成员都改过来了
【3】静态数据成员存储在全局数据区,且在定义时要分配空间,不能在类声明中定义
【4】静态数据成员和普通数据成员一样都遵从public,protected,private的访问规则
【5】静态数据成员和全局变量相比的优势:没有进入程序的全局名字空间,不存在于其他全局名字冲突的可能;静态数据成员可以是private函数而全局变量不能,因而可以实现信息隐藏
静态成员函数
【1】静态成员函数不可以访问非静态数据成员和非静态成员函数,而非静态成员函数可以任意地访问静态数据成员和静态成员函数,静态成员之间可以互相访问,包括访问静态数据成员和静态成员函数
【2】出现在类体外的函数定义不能指定关键字static
【3】由于没有this指针的额外开销,静态成员函数与类的全局函数相比速度会有少许提升
【4】静态数据成员和静态成员函数都可以通过.和::方式来访问
2. 数据库设计的3大范式
[1] 什么是范式
范式:规范的用来优化数据库数据存储的方式
3大范式:
第一范式:1NF(normal form)。当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了
第二范式:2NF。如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式
第三范式:3NF。设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式
注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
[2] 3大范式
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库
第一范式:确保每列保持原子性,所有字段都是不可分解的原子值
- 比如地点字段:”云南省曲靖市麒麟区建设路内环东路86号“,但是如果系统经常会访问地址中的省份、城市等,就需要将地址字段拆成”省份“、”城市“、”详细地址“等多个部分进行存储
第二范式:确保表中的每列都和主键相关
- 也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
- 比如:在一份客户商品订单数据库中,”客户信息“、”每单商品信息“、”商品详细信息“等都是可拆分的,建立三个表,一个表中只保存一种和主键相关的数据
第三范式:确保每列都和主键列直接相关,而不是间接相关
每一列数据都和主键直接相关,而不能间接相关
比如:订单中”公司订单记录的信息“和”客户信息“可分别作为两个表
3. map和Hash_table/map的区别
首先,hash_table和hash_map,两者几乎等价,除了线程安全和速度上的区别
[1] 线程安全:hash_table是synchronized(多线程,同步锁)的,线程安全;hash_map是非synchronized的,不保证线程安全
[2] 速度:hash_table是线程安全也是同步的,在单线程的情况下比hash_map要慢,使用hash_map的性能比hash_table好
所以hash_map和map的区别在于:
【1】 构造函数:hash_map需要hash函数,是等于函数;map需要比较函数,是小于函数
【2】 查找速度:hash_map由于利用了数组的快速寻址和链表的元素操作特性,查找速度比map快,而且是常数级别的复杂度;map的查找速度是log2(n)级别的,因此在数据量比较大的时候采用hash_map
【3】 存储结构:hash_map采用hash表存储;map一般采用红黑树(RB-Tree)实现,因此内存数据结构是不一样的
【4】 内存消耗:hash_map使用hash表是一种空间换时间的方法,因此在数据量比较大的时候,内存消耗比较大,而且hash_map的构造速度也比较慢
4. 随机数生成练习
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int GetRandNum(void)
{
int randomNum;
randomNum = rand() % 100; //不是全都不同,如果要不同可以正常赋不同值,或者'洗牌'
return randomNum;
}
int main()
{
int arr[100] = {0};
int i;
srand((unsigned)time(NULL)); //随机数生成种子放在循环外,否则循环过快得到的数都相同
for (i = 0; i < 100; i++)
{
arr[i] = GetRandNum();
}
i = 0;
for (i = 0; i < 100; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
参考文章:
http://blog.csdn.net/leo115/article/details/8085414
http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/08/2542315.html
http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html(推荐,数据库范式)
http://www.cnblogs.com/knowledgesea/p/3667395.html
http://blog.csdn.net/qq51931373/article/details/44196859(推荐,hash_map和map)
http://blog.csdn.net/pamchen/article/details/7788446
2017.10.25