C++学习笔记——模板、STL

模板

建立通用的模具,提高复用性。

模板的特点:不可以直接使用,只是一个框架。模板的通用不是万能的。

面向对象编程思想//泛型编程——利用模板技术。

两种模板机制:函数模板类模板


1 函数模板

void func(int a) {} 将void(返回值类型)和int(形参类型)抽象话,用虚拟的类型来表示。


template<typename T>

函数声明或定义

template:声明创建模板

typename

T:通用的数据类型,可替换


模板使用方式

1.自动类型推导==== mySwap(a, b);

2.显示指定类型====== mySwap<int>(a, b);


普通函数调用,可以发生隐式类型转换。

函数模板用,用自动类型推导不可以发生隐式类型转换。

函数模板用,用显示指定类型可以发生隐式类型转换。


普通函数和函数模板的调用规则

1.普通模板优先。

2.利用空模板参数列表来强制调用函数模板。

3.函数模板可以重载。

4.如果函数模板可以产生更好的匹配,函数模板优先调用。


STL

Standard Template Library 标准模板库

STL从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator)。

容器算法之间通过迭代器进行无缝衔接。

STL几乎所有的代码都采用了模板类或者模板函数


1 STL六大组件

容器:数据结构。

算法:算法。

迭代器:连接容器和算法。

仿函数:行为类似函数,可作为算法的某种策略。

适配器(配接器):修饰容器、仿函数、迭代器接口。

空间配置器:负责空间的配置和管理。


2 容器 算法 迭代器

容器

序列式容器:数组、链表、栈、队列……

关联式容器:二叉树

Algorithm:质变算法(替换、删除)/非质变算法(遍历、寻找)

迭代器:算法要通过迭代器才能访问容器中的元素。

    每个容器都有专属的迭代器。

    类似于指针。

随机访问迭代器,功能强大,常用。


STL常用容器

1 string

string——c++风格的字符串,本质是一个类,封装了char*。

内部封装了很多成员方法。

1.1构造函数

string();                         创建一个空字符串

string(const char* s);     利用已知字符串给string初始化

string(const string &str); 拷贝函数 利用一个string对象给另一个string对象初始化

string(int n, char c);     n个字符c组成的字符串

1.2 赋值操作

=

string& operator=(const char *s);

string& operator=(const string &str);

string& operator=(char c);

str.assign();

string& assign(const char *s);

string& assign(const char *s, int n); 把字符串s的前n个字符赋值给string

string& assign(const string &str);

string& assign(int n ,char c);

1.3 字符串拼接

+

string& operator+=(const char *s);

string& operator+=(const char c);

string& operator+=(const string &str);

str.append();

string& append(const char *c);

string& append(const char *c, int n);

string& append(const string &str);

string& append(const string &str, int pos, int n);

1.4 查找和替换

int find(); 从pos位置开始,查找字符/字符串在string里第一次出现的位置,并返回

int find(const string &str, int pos = 0)const;

int find(const char *s, int pos = 0)const;

int find(const char *s, int pos = 0, int n)const;

int rfind(); 从pos位置开始,查找字符/字符串在string里最后一次出现的位置,并返回

int rfind(const string &str, int pos = npos)const;

int rfind(const char *s, int pos = npos)const;

string& replace();

string& replace(int pos, int n, const string &str);        从pos开始的n个字符替换为str

string& replace(int pos, in n, const char *s); 从pos开始的n个字符替换为s

1.5 比较

int compare();

int compare(const string &str)const;

1.6 字符存取

[] at

2 vector

~数组,单端数组。

动态扩展:找一块更大的内存空间,拷贝原数据,释放原空间。

支持随机访问。

1.1 构造、赋值

构造

vector<T> v;

vector(v.begin(), v.end());

vector(n, elem);

vector(const vector &vec);

赋值

1.2 容量、大小

empty(); 判空

capacity(); 容量

size(); 返回元素个数

resize(int num); 重新定义vector长度为num,默认值填充/删除尾部

resize(int num, elem); 用elem填充

1.3 插入、删除、数据存取

插入

push_back(elem);   尾部插入元素elem

insert(const_iterator pos, elem);   迭代器指向位置pos处插入元素elem

insert(const_iterator pos, int count, elem); 迭代器指向位置pos处插入count个元素elem

删除

pop_back();     尾部删除元素

erase(const_iterator pos);                          删除迭代器指向位置pos的元素

erase(const_iterator start, const_iterator end);   删除迭代器指向位置从start到end之间的元素

clear();     删除容器中所有元素

数据存取

at(int idx); 返回索引 idx 所指向的数据

operator[];

front(); 返回第一个数据元素

back(); 返回最后一个元素

1.4 互换、预留

swap(vec);

reserve(int len);

3 deque

双端数组

在头部的插入删除比vector快,vector访问元素更快。

中控器——维护每段缓冲区地址——缓冲区中存放真实数据

迭代器支持随机访问。

3.1 构造、赋值、大小

构造

deque<T>;

deque<beg, end>;

deque(n, elem);

deque(const deque &deq);

赋值

deque& operator=(const deque &deq);

assign(beg, end);

assign(n, elem);

大小

empty();

size();

resize(num);

resize(num, elem);

3.2 插入、删除

两端操作

push_front(elem); push_back(elem);

pop_front(); pop_back();

指定位置操作

insert(pos, elem); (pos为迭代器)

insert(pos, int num, elem); insert(pos, beg, end);

erase(beg, end); erase(pos);

clear();

4 list

双向链表

双向迭代器

4.1 构造、赋值、大小

构造

list<T> let; list(beg, end);

list(n, elem); list(const list &lst);

赋值

assign(beg, end); assign(n, elem);

list& operator=(const list &lst); swap(lst);

大小

size(); empty();

resize(len); resize(len, elem);`

4.2 插入、删除、反转、排序

插入、删除

push_front(elem);    push_back(elem);

pop_front();    pop_back();

insert(pos, elem);            pos--迭代器

erase(pos);

remove(elem);    删除与elem匹配的元素

front(); back(); 返回第一个元素/最后一个元素

反转、排序

所有不支持随机访问迭代器的容器,不可以用标准算法

reverse();

sort(); 默认为升序。 若要降序,需另创建一个bool型对比函数

sort(Compare);

5 set、multiset

所有元素在插入时自动被排序

set、multiset属于关联式容器,底层结构是二叉树

set不允许重复的元素。multiset允许。 包含set头文件即可。

6 map、multimap

map中所有元素都是pair

pair<key, value>, key起到索引作用,value是元素的真实数据map中按照key值自动排序

关联式容器,底层结构是二叉树,自动排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值