C++之STL库简介

2024-01-09 22:09:04

?

目录

一、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库的核心组件包括以下三个部分:

  1. 容器(Containers):STL库提供了多个容器类,包括vector、list、deque、queue、stack、set、map等,这些容器类支持不同的数据结构和访问方式,可以满足各种不同的需求。

  2. 算法(Algorithms):STL库提供了大量的算法函数,包括查找、排序、变换、数值计算等,这些算法函数可以对容器中的元素进行操作,从而实现各种有用的功能。

  3. 迭代器(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库还提供了丰富的算法函数,让开发者能够快速高效地处理数据和实现各种功能。

文章来源:https://blog.csdn.net/m0_62338174/article/details/135408206
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。