STL

STL(Standard Template Library,标准模板库)是 C++ 标准库的一部分,提供了一组通用的、可重用的模板类和算法,用于处理常见的数据结构和操作。STL 通过提供高效、抽象和灵活的代码,使开发者能够更快速地实现常见的数据操作,而无需从头开始编写底层实现。 STL 的核心包括三部分: 容器(Containers):用于存储和管理数据的对象。 算法(Algorithms):用于操作容器数据的函数。 迭代器(Iterators):用于遍历容器的对象,类似于指针。 函数对象(Function Objects):即可调用的对象,通常与算法结合使用。 STL 的主要组成部分: 1. 容器(Containers) 容器是用于存储数据的对象,它们通过提供不同的结构(如数组、链表、哈希表等)来管理数据。STL 提供了多种容器,主要分为以下几类: 顺序容器(Sequence Containers): 这些容器按顺序存储元素,元素的位置由其在容器中的位置决定。 常见的顺序容器包括: vector:动态数组,支持快速随机访问和尾部插入/删除。 deque:双端队列,支持在两端进行高效的插入和删除。 list:双向链表,支持高效的在两端进行插入和删除,但不支持快速随机访问。 array:固定大小的数组,大小在编译时确定,提供常数时间的元素访问。 关联容器(Associative Containers): 这些容器根据元素的键值对存储元素,并支持高效的键查找。 常见的关联容器包括: set:集合,不允许重复元素,自动排序。 map:映射,存储键值对(key-value),键不重复,自动排序。 multiset:多重集合,允许重复元素,自动排序。 multimap:多重映射,允许键重复,自动排序。 无序容器(Unordered Containers): 这些容器基于哈希表实现,提供常数时间的查找操作,但元素没有顺序。 常见的无序容器包括: unordered_set:无序集合,基于哈希表存储元素。 unordered_map:无序映射,基于哈希表存储键值对。 2. 算法(Algorithms) STL 提供了大量的算法,涵盖了排序、查找、修改等常见操作。STL 算法是泛型的,即它们可以与任何符合要求的容器配合使用。常见的算法包括: 排序算法:sort、stable_sort、partial_sort 等。 查找算法:find、binary_search、lower_bound、upper_bound 等。 修改算法:reverse、rotate、swap 等。 数值算法:accumulate、count、fill 等。 集合操作:set_union、set_intersection、set_difference 等。 这些算法通常都接受迭代器作为参数,使它们与各种容器兼容。 3. 迭代器(Iterators) 迭代器是 STL 中用于遍历容器的对象,它们可以看作是容器的指针。通过迭代器,算法可以访问容器中的元素,而不关心容器的具体实现。迭代器的类型有: 输入迭代器(Input Iterator):只能进行单向读取。 输出迭代器(Output Iterator):只能进行单向写入。 前向迭代器(Forward Iterator):可以进行多次读取和写入,支持双向遍历。 双向迭代器(Bidirectional Iterator):除了前向迭代,还可以进行反向迭代。 随机访问迭代器(Random Access Iterator):支持随机访问,可以直接跳转到容器中的任何位置。 4. 函数对象(Function Objects) 函数对象是实现了 operator() 的对象,它们可以像普通函数一样被调用。STL 算法广泛使用函数对象来指定排序规则、判断条件等。例如: ...

二月 18, 2025 · 林墨瀚

Vector 向量

Vector 是一种动态数组,属于 STL 中的容器类之一,它提供了可以自动扩展大小的数组功能。与传统的数组不同,Vector 在需要时会自动调整大小,且支持快速访问、插入、删除等操作。 Vector 的特点: 动态大小:Vector 的大小是动态变化的,可以根据需要自动增长或缩小,避免了固定大小数组的限制。 按索引访问:可以像数组一样使用索引来访问 Vector 中的元素。 存储效率:Vector 会根据需要自动调整内部存储的大小,通常会预留一些额外空间来减少频繁的内存重新分配。 随机访问:支持快速随机访问,时间复杂度为 O(1),就像数组一样。 支持常见操作:Vector 提供了许多常见的操作,如插入、删除、查找、排序等。 Vector 的优点: 灵活性:不需要事先知道容器的大小,可以动态调整。 效率:与数组相比,Vector 在元素插入和删除时表现更好,尤其是插入到末尾时。 内存管理:Vector 会根据需要自动调整内部容量,减少了内存浪费。 Vector 的缺点: 在中间插入和删除效率低:虽然插入和删除操作通常很高效,但在 Vector 中间插入或删除元素时,可能需要移动大量的元素,时间复杂度为 O(n)。 内存重新分配:当 Vector 需要扩展容量时,它会分配一个新的更大的数组,并将元素复制到新的位置,这个过程可能会影响性能,尤其是元素较多时。 Vector 的常见操作: 访问元素:使用索引或迭代器访问元素。 插入元素:可以在末尾插入元素,或者在指定位置插入。 删除元素:可以删除指定位置的元素,或者删除末尾的元素。 查找元素:可以使用 find 等函数查找元素。 示例(C++): #include <iostream> #include <vector> // 引入vector头文件 using namespace std; int main() { // 创建一个空的vector vector<int> vec; // 在末尾插入元素 vec.push_back(10); // 插入10 vec.push_back(20); // 插入20 vec.push_back(30); // 插入30 // 访问元素 cout << "第一个元素: " << vec[0] << endl; // 输出: 10 cout << "第二个元素: " << vec.at(1) << endl; // 输出: 20 // 删除末尾元素 vec.pop_back(); // 删除30 // 遍历vector cout << "Vector中的元素: "; for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; // 输出: 10 20 } cout << endl; // 在指定位置插入元素 vec.insert(vec.begin() + 1, 15); // 在第二个位置插入15 cout << "插入15后的元素: "; for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; // 输出: 10 15 20 } cout << endl; return 0; } 代码解析: push_back:将元素添加到 Vector 的末尾。 vec[0] 或 vec.at(1):通过索引或 at 方法访问元素,at 方法会进行越界检查。 pop_back:删除 Vector 末尾的元素。 insert:在指定位置插入元素,vec.begin() + 1 表示第二个位置。 Vector 的应用: 动态数组:Vector 主要用于处理不知道大小的动态数据集合,且需要快速随机访问和插入删除操作。 实现其他数据结构:Vector 可以用来实现栈、队列等数据结构。例:栈可以用 push_back 添加元素,使用 pop_back 删除元素。 数据存储:适用于存储需要动态增加或删除元素的场景,如图像数据、传感器数据等。 算法优化:由于 Vector 支持高效的随机访问,它常用于一些需要按位置访问元素的算法,如快速排序、查找算法等。 总结: Vector 是一个灵活且高效的动态数组容器,广泛应用于需要动态管理数据的场景。相比传统数组,它提供了更好的内存管理和扩展能力,适用于频繁添加元素的场合。 ...

二月 18, 2025 · 林墨瀚