C/C++基础-static作用/数据库范式/随机数生成

序言

零散知识点复习


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值