C++(CPP)的部分高级特性

一、STL

STL(Standard Template Library),名为标准模板库,是C++标准库的一部分,故不需要单独安装。

提出STL的主要目的就是将数据结构、操作与算法分离,并提供常见的数据结构、操作与算法,简化开发流程。

STL由容器、算法、迭代器、函数对象(仿函数)、适配器与内存分配器这6部分组成。这6部分中的后面4部分为容器和算法服务。

名称 功能
容器 封装了数据结构的模板类。例如vector。
算法 大部分包含在头文件,少部分包含在头文件中。
迭代器 提供对容器的读与写的功能,连接容器与算法。
函数对象 若一个类将()运算符重载为成员函数,那么这个类就被称为函数对象类,这个类的对象就是函数对象(仿函数)。
适配器 将一个类的接口(模板的参数)适配为用户的指定形式,从而让原本不能衔接的类衔接成功来一起工作。容器、迭代器和函数都有适配器。
内存分配器 为容器类模板提供自定义的内存申请和释放功能。

STL不是面向对象的,而是体现了泛型程序设计的思想。

常见的容器如下:

(一)vector(可变长数组)

1.vector对象的定义与初始化方式

用法 功能
vector v1 定义一个名为v1,元素类型为T的空vector

vector v2(v1)

vector v2 = v1

用v2中的元素初始化v1
vector v3(n, val) v3中包含n个值为val的元素
vector v4(n) v3中包含了n个默认值初始化的元素
vector v5{a, b, c...} 使用 a, b, c... 初始化 v5
vector> matrix(M,vector(N)); 二维数组初始化

2.常用操作

用法 功能
v.empty() 如果v为空则返回true,否则返回false
v.size() 返回v中元素的个数
v.push_back(val)

向vector的尾端添加值为val的元素。

v.pop_back(val) 删除尾元素,返回void。
v.back() 返回v中最后一个元素的引用。
v.front() 返回v中第一个元素的引用。
v[n] 返回v中第n个位置上元素的引用,不能用下标操作添加元素。
v1 = v2 用v2中的元素替换v1中的元素
v1 = {a, b, c...} 用元素 {a, b, c...} 替换v1中的元素
v1 == v2 当且仅当拥有相同数量且相同位置上值相同的元素时,v1与v2相等。
v1 != v2 不满足相等就是不等。
<, <=, >, >= 以字典序进行比较。

 

3.vector中迭代器的使用

若将指针理解为元素的地址,那么迭代器可以理解为元素的索引。

迭代器提供了对容器的间接访问。

一个迭代器的范围可表示为[a.begin(),a.end())。begin返回指向第一个元素的迭代器,end返回指向容器最后一个元素的下一位置的迭代器。迭代器的范围对于访问容器二言是一个左闭右开区间。

下面程序展示了vector的迭代器的用法。

#include 
#include 
 
int main(void)
{
    std:: vector< int > a{1,2,3,4,5};
    auto it = a.begin();  
    while(it != a.end())
    {
        std::cout << *it << std:: endl;
        it++;
    }
    return 0;
}

结果:

C++(CPP)的部分高级特性_第1张图片

函数 功能
begin() 获得指向第一个元素的迭代器。
end() 获得指向尾元素后面位置的迭代器。
insert(p,n,val) 在迭代器p前插入n个值为val的元素,返回新添加的第一个元素的迭代器。
erase(p) 删除迭代器p指向的元素,返回指向被删除元素的下一个元素的迭代器。
erase(b,e) 删除迭代器b与迭代器e间的所有元素,返回指向最后一个被删除元素的下一个元素的迭代器。

4.vector的排序操作(需要加入头文件

函数 功能
sort(a.begin(), a.end(),比较函数[可选]) 按输入序列的字典序升序排序,原位操作,无返回值。
unique(a.begin(), a.end()) 消除输入序列的相邻的重复项,返回一个指向无重复值范围末尾的迭代器。
reverse(a.begin(), a.end()) 将输入序列按照下标逆序排列,原位操作,无返回值。

5.vector的找值操作(需要加入头文件

函数 功能
max_element(a.begin(), a.end()) 返回指定范围内的最大值的迭代器。
min_element(a.begin(), a.end()) 返回指定范围内的最小值的迭代器。
distance(x,y) 返回迭代器x与迭代器y间的距离。

6. vector的变形操作

函数 功能
v.resize(n,t)

调整v的大小为n个元素,新添加的元素初始化为t值。

(二)map(有序关联容器)

map提供一对一的哈希。

map中的每个元素有两个属性,第一个是关键字(key),第二个是值(value),每个关键字只能在map中出现一次,且每个关键字都关联一个值,组成了键-值对。map的内部实现是一颗红黑树。

1.定义map对象

用法 功能
map name 定义一个名为name的map,其键类型为k_type,值类型为value_type。

2.常用操作(部分函数在中)

函数 功能
begin() 返回指向map头部的迭代器。
end()  返回指向map末尾的迭代器。
empty() 如果map为空则返回true。
clear() 删除所有元素。
size() 返回map中元素的个数。
rbegin() 返回一个指向map尾部的逆向迭代器。
rend() 返回一个指向map头部的逆向迭代器。
swap() 交换 2 个 map 容器中存储的键值对,这意味着,操作的 2 个键值对的类型必须相同。
find(key) 在 map 容器中查找键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
lower_bound(key) 返回一个指向当前 map 容器中第一个大于或等于 key 的键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
upper_bound(key) 返回一个指向当前 map 容器中第一个大于 key 的键值对的迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
equal_range(key) 该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为 key 的键值对(map 容器键值对唯一,因此该范围最多包含一个键值对)。
count(key) 在当前 map 容器中,查找键为 key 的键值对的个数并返回。注意,由于 map 容器中各键值对的键的值是唯一的,因此该函数的返回值最大为 1。
at(key) 找到 map 容器中 key 键对应的值,如果找不到,该函数会引发 out_of_range 异常。

3.在map中插入元素 

方法 功能
insert(pair(key_content, value_content)) 向map中插入键为key_content、值为value_content的键值对。
emplace(key_content, value_content) 向map中插入键值对。
name[key_content]=value_content 用类似索引的方式插入

二、auto

该关键字的功能就是,根据后面的值来推测前面的类型是什么。

注意点:

  1. 用auto声明的变量必须初始化。
  2. 函数和模板参数不能被声明为auto。
  3. auto仅仅是一个占位符,不是一种类型,所以不能用于类型转换、sizeof()、typeid()等操作。
  4. 定义在一个auto序列的变量始终推导成同一类型。

三、内存管理

(一)std::shared_ptr(引用计数智能指针)

使用一个共享变量来记录指针管理的对象被引用了几次。当引用计数为0时,说明该对象没有被引用,自动回收内存。

std::make_shared创建。

(二)std::unique_ptr(表示所有权的智能指针)

该指针要求它管理的对象只能有一次引用,当引用计数为0时,自动回收内存。

std::make_unique创建。

参考资料:

 [1]C++之STL(标准模板库)介绍_vector::_m_range_check-CSDN博客 

 [2]C++ 数组(vector)常用操作总结_vector操作-CSDN博客

 [3]C++ map用法总结(整理)_c++map用法-CSDN博客

 [4]C++ STL map容器详解 (biancheng.net) 

 [5]C++ 介绍 - USTC 编译原理和技术 2023 (ustc-compiler-principles.github.io)

你可能感兴趣的:(c++,开发语言)