目录
一、STL(Standard Template Library,标准模板库)
二、容器(Containers)
1.vector(动态数组)
2.list(双向链表)
3.deque(双端队列)
4.stack(栈)
5.queue(队列)
6.set(集合)
7.map(映射)
三、算法(Algorithms)
四、迭代器(Iterators)
一、STL(Standard Template Library,标准模板库)
是一组C++标准库的组合,其中包括多个容器类、算法和迭代器等。STL库的设计目标是提供一组通用的数据结构和算法,从而使C++程序员能够编写高效、可维护的代码。
STL库的核心组件包括以下三个部分:
容器(Containers):STL库提供了多个容器类,包括vector、list、deque、queue、stack、set、map等,这些容器类支持不同的数据结构和访问方式,可以满足各种不同的需求。
算法(Algorithms):STL库提供了大量的算法函数,包括查找、排序、变换、数值计算等,这些算法函数可以对容器中的元素进行操作,从而实现各种有用的功能。
迭代器(Iterators):STL库提供了多个迭代器类,包括input_iterator、output_iterator、forward_iterator、bidirectional_iterator、random_access_iterator等,这些迭代器类支持不同的遍历方式和访问方式,可以帮助程序员快速、方便地访问容器中的元素。
使用STL库,程序员可以通过简单的代码实现复杂的数据结构和算法。例如,使用vector容器和sort算法可以快速地对一组数据进行排序,而使用set容器和find算法可以快速地查找某个元素是否存在于一个集合中。在实际的软件开发中,STL库已经成为C++程序员必不可少的工具之一。
STL库的核心组件包括容器(Containers)、算法(Algorithms)和迭代器(Iterators)。下面将对每个组件进行详细介绍,并给出相应的案例。
二、容器(Containers)
STL库提供了多个容器类,用于存储和管理数据。常用的容器类包括:
以下是一个使用vector容器的示例,展示了如何存储一组整数并进行遍历:
- vector:动态数组,支持随机访问。
- list:双向链表,支持快速插入和删除。
- deque:双端队列,支持头尾快速插入和删除。
- stack:栈,后进先出。
- queue:队列,先进先出。
- set:集合,有序且不重复的元素集合。
- map:映射,键值对的集合。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers; // 创建一个空的vector容器
// 向容器中添加数据
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
numbers.push_back(40);
// 遍历容器中的数据并打印
for (const auto& num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
下面对STL库中的容器进行详细介绍:
1.vector(动态数组)
vector是一个动态数组,支持随机访问,并且具有动态调整大小的能力。它在内存中以连续的块存储元素,可以通过下标直接访问元素。vector的插入和删除操作相对较慢,但是访问元素的速度很快。
2.list(双向链表)
list是一个双向链表,支持快速插入和删除操作。它的每个元素都包含一个前向指针和一个后向指针,这使得在任意位置进行插入和删除操作非常高效。然而,由于链表的特性,list不支持随机访问,只能通过迭代器进行遍历。
3.deque(双端队列)
deque是一个双端队列,可以在头部和尾部进行快速插入和删除操作。它内部使用多个缓冲区存储元素,支持动态调整大小。和vector一样,deque也支持随机访问。
4.stack(栈)
stack是一个后进先出(LIFO)的数据结构,它基于其他容器实现,如deque或list。栈只能在顶部进行插入和删除操作,不支持随机访问。常用的操作包括push(入栈)、pop(出栈)和top(获取栈顶元素)。
5.queue(队列)
queue是一个先进先出(FIFO)的数据结构,它也基于其他容器实现,如deque或list。队列只能在尾部进行插入操作,在头部进行删除操作,不支持随机访问。常用的操作包括push(入队)、pop(出队)和front(获取队头元素)。
6.set(集合)
set是一个集合,其中的元素按照某种特定的排序规则进行存储,并且不允许有重复元素。set内部使用红黑树实现,这使得插入、删除和查找操作的时间复杂度都是O(log n)。常用的操作包括insert(插入元素)、erase(删除元素)和find(查找元素)。
7.map(映射)
map是一个键值对的集合,其中的每个元素由一个键和一个值组成。map中的元素按照键的排序规则进行存储,并且不允许有重复键。map也是基于红黑树实现的,常用的操作包括insert(插入键值对)、erase(删除键值对)和find(查找键值对)。
假设我们要编写一个程序,用于存储和管理学生信息,包括姓名、年龄和成绩等。为了实现这一功能,我们可以使用STL库中的容器类来存储学生对象,并且可以通过各种操作来管理这些学生信息。
具体实现如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 学生类
class Student {
public:
string name;
int age;
double score;
Student() {}
Student(const string& n, int a, double s) : name(n), age(a), score(s) {}
};
// 学生管理类
class StudentManager {
private:
vector<Student> students; // 学生列表
public:
// 添加学生
void addStudent(const Student& s) {
students.push_back(s);
}
// 删除学生
void removeStudent(const string& name) {
for (auto it = students.begin(); it != students.end(); ++it) {
if (it->name == name) {
students.erase(it);
break;
}
}
}
// 修改学生信息
void modifyStudent(const string& name, int age, double score) {
for (auto& s : students) {
if (s.name == name) {
s.age = age;
s.score = score;
break;
}
}
}
// 查找学生信息
Student* findStudent(const string& name) {
for (auto& s : students) {
if (s.name == name) {
return &s;
}
}
return nullptr;
}
// 按成绩排序
void sortByScore() {
sort(students.begin(), students.end(), [](const Student& lhs, const Student& rhs) {
return lhs.score > rhs.score;
});
}
// 显示所有学生信息
void displayAllStudents() {
for (auto& s : students) {
cout << "Name: " << s.name << ", Age: " << s.age << ", Score: " << s.score << endl;
}
}
};
int main() {
StudentManager sm;
// 添加学生
sm.addStudent(Student("Tom", 18, 80.5));
sm.addStudent(Student("Alice", 19, 90.0));
sm.addStudent(Student("Bob", 20, 85.5));
// 查找学生信息
Student* s = sm.findStudent("Tom");
if (s != nullptr) {
cout << "Found student: " << s->name << ", Age: " << s->age << ", Score: " << s->score << endl;
} else {
cout << "Student not found." << endl;
}
// 修改学生信息
sm.modifyStudent("Alice", 20, 95.0);
// 删除学生
sm.removeStudent("Bob");
// 按成绩排序
sm.sortByScore();
// 显示所有学生信息
sm.displayAllStudents();
return 0;
}
三、算法(Algorithms)
STL库提供了大量的算法函数,用于对容器中的元素执行各种操作,如查找、排序、变换和数值计算等。常用的算法函数包括:
以下是一个使用sort算法对vector容器进行排序的示例:
- find:在容器中查找指定元素。
- sort:对容器中的元素进行排序。
- transform:将容器中的元素按照某个规则进行转换。
- accumulate:计算容器中元素的累加或累乘结果。
-
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {5, 3, 8, 1, 2, 4}; // 使用sort算法对容器进行排序 std::sort(numbers.begin(), numbers.end()); // 打印排序后的结果 for (const auto& num : numbers) { std::cout << num << " "; } std::cout << std::endl; return 0; }
四、迭代器(Iterators)
-
迭代器是STL库中用于遍历和访问容器元素的通用接口。迭代器提供了统一的方式来访问不同类型容器的元素,使算法能够独立于具体容器的实现。常用的迭代器类型包括:
以下是一个使用迭代器遍历vector容器的示例:
- iterator:可读写的迭代器。
- const_iterator:只读的迭代器。
- reverse_iterator:反向迭代器。
- const_reverse_iterator:只读的反向迭代器。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 使用迭代器遍历容器并打印元素
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
通过使用STL库,程序员可以方便地使用各种数据结构和算法,并减少重复编写代码的工作量。此外,STL库还提供了丰富的算法函数,让开发者能够快速高效地处理数据和实现各种功能。