基于斯坦福cs106l的c++编程规范笔记

c++特性

  • 更好的C C++支持命令式编程,一种编程风格,其中程序按顺序执行的命令序列。从这个意义上讲,C++ 可以看作是对C 编程语言,使日常命令式编程更加直观和更容易使用。课程阅读器的这一部分介绍了一些 C++ 最常用的库,包括标准模板库,并展示了如何使用这些库来构建命令程式。 此外,它探索了最初出现在 C++ 语言中的新原语。C 编程语言,即指针、C 字符串和预处理器。
  • 数据抽象

C++与其兄弟C的最大区别在于_数据抽象_,程序执行的方式可以与程序执行的方式分开 程序员谈论那个程序。

  • 面向对象编程

. 面向对象编程是一种完全不同的方式考虑程序设计,可以极大地简化复杂的软件系统。 钥匙 面向对象背后的概念很简单,但要真正体会到面向对象的力量 编程,您将需要一次又一次地看到它的运行情况。 这部分课程 读者探索了面向对象编程中的主要概念以及如何在 C++ 中实现它继承和多态。

  • 泛型编程

泛型编程是一种编程风格,旨在构建可以解决一系列远远超出最初设想的问题的软件
履行。 虽然泛型编程的完整处理远远超出了介绍性的范围C++ 编程课,泛型编程的许多思想都可以访问并且可以从根本上改变了您对 C++ 编程的看法。

const

Can’t declare non-const reference to const variable Can’t declare non-const reference to const vari

图片 图片

模板

图片 函数指针:将函数作为对象传递

stl

sequence:线性,有顺序 associative:不一定线性,有索引机制(map)

vector:有顺序的相同类型的数据集合,大小可控制 ---子属性:size:元素数量 ---capacity:单个元素大小 图片 vector最常用,deque用于首部插入场合,list用于多种列表

associative(关联数组):有顺序的需要有比较方法,无序的需要哈希函数(更快) iterators(迭代器):用于访问容器中的所有数据 --常用函数,begin(),end(),iter++,*(pointer),== !=,=(赋值,复制), 图片 图片 图片

输入输出流

First call to std::cin >> creates a command line
prompt that allows the user to type until they hit enter

  • Each >> ONLY reads until the next whitespace
  • Whitespace = tab, space, newline
  • Everything after the first whitespace gets saved and
    used the next time std::cin >> is called
  • The place its saved is called a buffer 图片 图片 图片 图片 图片 图片 图片

hashmap的c++实现

相关函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
构造函数HashMap():
接受参数count(值的个数),hash function(有默认值)

参数(typename fitst,typename last,bucket_count,H)
//用一个容器首尾指针初始化hashmap
eg.
hashmap<k,m> map{vec.begin(),vec.end()}

参数(init_list init,bucket_count,H)
//用容器直接初始化hashmap
eg.
HashMap<char, int> map{{'a', 3}, {'b', 5}, {'c', 7}};

public:
key-键
mapped-被加密的值(int)
H-哈希函数
bucket_count(存储的键值对数组容量)
load_factor(内联函数,返回size/bucket_count,即实际储存值的键值对)
contains(参数const K& key判断是否存在改键,返回bool值)
at(参数k,返回mapped的引用)
clear(清空键值对)
insert(参数为键值对引用,返回一对pair<iterator,bool>,iter指向改键值对,无论是否已存在,bool表示是否成功添加,如为false则已存在该键值对)
erase(key为参数,返回bool值)
earse(iter为参数,返回该指针下一个位置)
rehash(size_t为参数,重新哈希为给出的新的指针数组大小)
begin(根据hashmap是否为const给出iter或const iter)
end(返回伪指针)
debug(打印所有哈希键值对以及哈希表所有参数,注意,必须基于重载<<运算符的基础)

符号重载:
M& [](const key& ,返回insert(key)的返回pair的first成员的second成员,即mapped值)
//用于给key对应的value(mapped)赋值

private:
node(struct,包含next指针和value)
nodepair(前后node的pair)
findnode(参数key,返回指针对<prev,curr>)
first_not_empty_bucket()
make_iterator(参数node*curr)
_bucket_array(vector<node*>,其中一个node*为ptr,则ptr->value为<key ,mapped>)

//指针构造

_bucket_array:由指针组成的数组,每个成员都是一个指针
储存的值为next指针和一个pair<key,mapped>
operator-> is a bit of an odd-ball. When you write p->m, it is interpreted as (p.operator->())->m.

- This means operator-> should return a pointer to the object that has the field m.

涉及的c++特性

匿名函数 基本lambda语法 基本形式如下: 【capture】(parameters)->return-type {body}

typename function() return {x,y,z} 即用{}的参数初始化原函数返回的类型

ptrdiff_t:用于储存两个指针的差

conditional_t<func,x,y>如果func为true则x,为false则y

forward_iterator_tag:单方向迭代器(可读写) ++iter,iter+=1随后返回对自身的引用 iter++,先返回一个对自身的复制,随后iter+=1

std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);

ate:从文件尾部开始 strsub(start,length) 移动语义(c++11新特性) clss(classname &&) 利用右值引用的部分数据直接初始化新的类,并在初始化之后将右值删除,可以通过std::move()强制转化左值为右值。