Skip to content

一.C++ STL 简介

C++ 标准模板库(Standard Template Library,STL)是一套功能强大的 C++ 模板类和函数的集合,它提供了一系列通用的、可复用的算法和数据结构。

STL 的设计基于泛型编程,这意味着使用模板可以编写出独立于任何特定数据类型的代码。

STL 分为多个组件,包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(Function Objects)和适配器(Adapters)等。

使用 STL 的好处:

  • 代码复用:STL 提供了大量的通用数据结构和算法,可以减少重复编写代码的工作。
  • 性能优化:STL 中的算法和数据结构都经过了优化,以提供最佳的性能。
  • 泛型编程:使用模板,STL 支持泛型编程,使得算法和数据结构可以适用于任何数据类型。
  • 易于维护:STL 的设计使得代码更加模块化,易于阅读和维护。

C++ 标准模板库的核心包括以下重要组件组件:

组件描述
容器(Containers)容器是 STL 中最基本的组件之一,提供了各种数据结构,包括向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等。这些容器具有不同的特性和用途,可以根据实际需求选择合适的容器。
算法(Algorithms)STL 提供了大量的算法,用于对容器中的元素进行各种操作,包括排序、搜索、复制、移动、变换等。这些算法在使用时不需要关心容器的具体类型,只需要指定要操作的范围即可。
迭代器(iterators)迭代器用于遍历容器中的元素,允许以统一的方式访问容器中的元素,而不用关心容器的内部实现细节。STL 提供了多种类型的迭代器,包括随机访问迭代器、双向迭代器、前向迭代器和输入输出迭代器等。
函数对象(Function Objects)函数对象是可以像函数一样调用的对象,可以用于算法中的各种操作。STL 提供了多种函数对象,包括一元函数对象、二元函数对象、谓词等,可以满足不同的需求。
适配器(Adapters)适配器用于将一种容器或迭代器适配成另一种容器或迭代器,以满足特定的需求。STL 提供了多种适配器,包括栈适配器(stack adapter)、队列适配器(queue adapter)和优先队列适配器(priority queue adapter)等。

这些个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

二.容器

容器是用来存储数据的序列,它们提供了不同的存储方式和访问模式。

STL 中的容器可以分为三类:

1、序列容器:

==存储元素的序列,允许双向遍历。==

std::vector:动态数组,支持快速随机访问。

cpp
void test(){  
	vector<int> v;  
	v.push_back(10);  
	v.push_back(20);  
	v.push_back(30);  
	v.push_back(40);  
	v.push_back(50);  
	  
	vector<int>::iterator pBegin = v.begin();  
	vector<int>::iterator pEnd = v.end();  
	  
	//第一种遍历方式  
	while (pBegin != pEnd){  
		cout << *pBegin << "\t";  
		pBegin++;  
	}  
	cout << endl;  
	  
	//第二种遍历方式for循环  
	for (vector<int>::iterator it = v.begin() ; it != v.end() ; it++) {  
		cout << *it << "\t";  
	}  
	cout << endl;  
	  
	  
	//第三种遍历方式algorithm  
	for_each(v.begin(),v.end(),myPrint);  
  
}

std::deque:双端队列,支持快速插入和删除。

std::list:链表,支持快速插入和删除,但不支持随机访问。

2、关联容器:

==存储键值对,每个元素都有一个键(key)和一个值(value),并且通过键来组织元素。==

  • std::set:集合,不允许重复元素。
  • std::multiset:多重集合,允许多个元素具有相同的键。
  • std::map:映射,每个键映射到一个值。
  • std::multimap:多重映射,允许多个键映射到相同的值。

3、无序容器(C++11 引入):

==哈希表,支持快速的查找、插入和删除。==

  • std::unordered_set:无序集合。
  • std::unordered_multiset:无序多重集合。
  • std::unordered_map:无序映射。
  • std::unordered_multimap:无序多重映射。

三.算法(Algorithms)

1.质变算法

运算过程中会更改元素内容,如拷贝,删除

2.非质变算法

运算过程中不会更改元素内容,如计数,遍历,查找

四.迭代器

在 C++ 中,迭代器是一个非常重要的概念,主要用于提供对容器中元素的访问。迭代器的行为类似于指针,可以通过迭代器遍历容器(如数组、列表、集合等)中的所有元素。迭代器是 C++ 标准库中的一部分,特别是与标准模板库(STL)中的容器配合使用。

支持随机访问的 STL 容器

不是所有的 STL 容器都支持随机访问迭代器。仅以下容器提供随机访问迭代器:

  • std::vector
  • std::deque
  • std::array (C++11 及以后)
  • std::string(实际上作为一个容器来看待)

迭代器的基本功能和类型

迭代器主要提供以下功能:

  • 访问元素:通过解引用迭代器(使用 * 操作符),可以访问它所指向的元素。
  • 迭代操作:迭代器支持递增 (++) 和递减 (--) 操作,用于移动到容器的下一个或上一个元素。
  • 比较操作:迭代器可以通过比较操作(如 ==!=)来判断是否到达容器的边界或者是否与其他迭代器相等。

C++ STL 中的迭代器类型主要有五种:

  1. 输入迭代器:只支持读取数据,可以递增,并能比较是否相等。
  2. 输出迭代器:只支持写入数据,可以递增。
  3. 前向迭代器:结合输入和输出迭代器的特性,支持单向移动。
  4. 双向迭代器:除了具有前向迭代器的所有特性外,还可以递减,即向前和向后移动。
  5. 随机访问迭代器:提供最强大的功能,支持直接访问任何元素,支持 +- 操作和比较大小,类似于指针的功能。

示例代码

下面是一个使用迭代器遍历 std::vector 的示例:

cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用迭代器遍历向量
    for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,vec.begin() 返回一个指向 std::vector 第一个元素的迭代器,而 vec.end() 返回一个指向 std::vector 最后一个元素之后位置的迭代器。++it 递增迭代器,移动到下一个元素。迭代器通过解引用(*it)访问元素的值。

迭代器为 C++ 中的数据访问提供了一种灵活和统一的方法,使得无论容器的内部实现如何,程序员都可以用相似的方式遍历和操作数据。

评论区

欢迎留言、补充或勘误。

xiaoba.blog