面向对象与泛型编程
(一)容器
4、queue容器
基本概念
Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口 队列容器允许从一端新增元素,从另一端移除元素 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为 队列中进数据称为 — 入队 push 队列中出数据称为 — 出队 pop
构造函数
queue<T> que; //queue采用模板类实现,queue对象的默认构造形式
queue(const queue &que); //拷贝构造函数
赋值操作
queue& operator=(const queue &que); //重载等号操作符
数据存取
push(elem); //往队尾添加元素
pop(); //从队头移除第一个元素
back(); //返回最后一个元素
front(); //返回第一个元素
大小操作
empty(); //判断堆栈是否为空
size(); //返回栈的大小
5、string容器
基本概念
string和char* 区别:
char* 是一个指针; string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。 特点:string 类内部封装了很多成员方法,例如:查找find,拷贝copy,删除delete 替换replace,插入insert;string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
string构造函数
string(); //创建一个空的字符串 例如: string str; string(const char* s); //使用字符串s初始化
string(const string& str); //使用一个string对象初始化另一个string对象
string(int n, char c); //使用n个字符c初始化
string赋值操作:给string字符串进行赋值
string& operator=(const char* s); //char*类型字符串 赋值给当前的字符串
string& operator=(const string &s); //把字符串s赋给当前的字符串
string& operator=(char c); //字符赋值给当前的字符串
string& assign(const char *s); //把字符串s赋给当前的字符串
string& assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s); //把字符串s赋给当前字符串
string& assign(int n, char c); //用n个字符c赋给当前字符串
string字符串拼接:实现在字符串末尾拼接字符串
string& operator+=(const char* str); //重载+=操作符
string& operator+=(const char c); //重载+=操作符
string& operator+=(const string& str); //重载+=操作符
string& append(const char *s); //把字符串s连接到当前字符串结尾
string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s); //同operator+=(const string& str)
string& append(const string &s, int pos, int n);//字符串s中从pos开始的n个字符连接到字符串结尾
string查找(查找指定字符串是否存在)和替换(在指定的位置替换字符串)
int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
string& replace(int pos, int n,const char* s); //替换从pos开始的n个字符为字符串s
总结:find查找是从左往后,rfind从右往左;find找到字符串后返回查找的第一个字符位置,找不到返回-1;replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串
string字符串比较
比较方式:
字符串比较是按字符的ASCII码进行对比:= 返回 0;> 返回 1;< 返回 -1
函数原型:
int compare(const string &s) const; //与字符串s比较
int compare(const char *s) const; //与字符c比较
string字符存取
char& operator[](int n); //通过[]方式取字符
char& at(int n); //通过at方法获取字符
string插入和删除
对string字符串进行插入和删除字符操作,插入和删除的起始下标都是从0开始
string& insert(int pos, const char* s); //插入字符
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c); //在指定位置插入n个字符c
string& erase(int pos, int n = npos); //删除从Pos开始的n个字符
string子串:从字符串中获取想要的子串
string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串
6、stack容器
基本概念
stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为 栈中进入数据称为 — 入栈 push 栈中弹出数据称为 — 出栈 pop
构造函数
stack<T> stk; //stack采用模板类实现, stack对象的默认构造形式
stack(const stack &stk); //拷贝构造函数
赋值操作
stack& operator=(const stack &stk); //重载等号操作符
数据存取
push(elem); //向栈顶添加元素
pop(); //从栈顶移除第一个元素
top(); //返回栈顶元素
大小操作
empty(); //判断堆栈是否为空
size(); //返回栈的大小
7、set/multiset容器
基本概念
所有元素都会在插入时自动被排序;set/multiset属于关联式容器,底层结构是用二叉树实现。 set和multiset区别:set不允许容器中有重复的元素;multiset允许容器中有重复的元素 set容器默认排序规则为从小到大,利用仿函数,可以改变排序规则;对于自定义数据类型,set必须指定排序规则才可以插入数据
常用接口
set<T> st; //默认构造函数:
set(const set &st); //拷贝构造函数
set& operator=(const set &st); //重载等号操作符
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
insert(elem); //在容器中插入元素。
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem); //删除容器中值为elem的元素。
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数
pair<type, type> p ( value1, value2 );
pair<type, type> p = make_pair( value1, value2 );//成对出现的数据,利用对组可以返回两个数据
8、map/multimap容器
基本概念
简介:map中所有元素都是pair。pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。所有元素都会根据元素的键值自动排序 本质:map/multimap属于关联式容器,底层结构是用二叉树实现。(关联式容器内部采用的就是一种非常高效的平衡检索二叉树:红黑树) 优点:可以根据key值快速找到value值 map和multimap区别:map不允许容器中有重复key值元素,multimap允许容器中有重复key值元素
常用接口
map<T1, T2> mp; //map默认构造函数: map(const map &mp); //拷贝构造函数 map& operator=(const map &mp); //重载等号操作符
size(); //返回容器中元素的数目empty(); //判断容器是否为空 swap(st); //交换两个集合容器 insert(elem); //在容器中插入元素。
clear(); //清除所有元素erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(key); //删除容器中值为key的元素。
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(); count(key); //统计key的元素个数map容器默认排序规则为 按照key值进行 从小到大排序,利用仿函数,可以改变排序规则
9、 map、unordered_map
map
map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树)
红黑树具有自动排序的功能,因此map内部的所有元素都是有序的 ,红黑树的每一个节点都代表着map的一个元素。 对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。 map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。 优点:有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作;红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高; 缺点: 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间 适用处:对于那些有顺序要求的问题,用map会更高效一些
unordered_map:
unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。 因此,其元素的排列顺序是无序的 。 优点: 因为内部实现了哈希表,因此其查找速度非常的快 缺点: 哈希表的建立比较耗费时间 适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map