STL库:C++数据结构与算法

一、STL概述

C++ STL(Standard Template Library)是C++标准库的重要组成部分,它是一组通用的模板类和函数,实现了大量的常用数据结构和算法,为我们提供了高效、可靠和安全的工具,简化了程序设计和开发。STL库中包含了以下容器:

  • 容器(Containers)
  • 迭代器(Iterators)
  • 算法(Algorithms)
  • 函数对象(Function Objects)
  • 适配器(Adapters)

STL库的设计理念是以泛型编程为基础,将数据类型和算法分开设计,使得数据结构和算法可以独立地发展和变换,从而实现代码的可重用性和可扩展性。

二、容器

容器是用于存储和管理数据的类模板,它们定义了一系列与数据操作有关的成员函数,可以快速地对数据进行插入、删除、查找等操作。常用的STL容器有以下几种:

1. vector

vector是一种动态数组,可以根据需要自动调整容量,实现高效的随机访问和插入/删除操作。例如:

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  for (int i = 0; i < v.size(); i++) {
    cout << v[i] << " ";
  }
  return 0;
}

输出结果为:1 2 3

2. list

list是一种双向链表,可以在任何位置进行插入和删除操作,但不支持随机访问。例如:

#include <iostream>
#include <list>
using namespace std;
int main() {
  list<int> l;
  l.push_back(1);
  l.push_back(2);
  l.push_back(3);
  for (auto iter = l.begin(); iter != l.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:1 2 3

3. map

map是一种关联容器,可以将键值对(Key-Value)组合存储,支持按照键值进行查找和删除等操作。例如:

#include <iostream>
#include <map>
using namespace std;
int main() {
  map<string, int> m;
  m["apple"] = 1;
  m["banana"] = 2;
  m["orange"] = 3;
  for (auto iter = m.begin(); iter != m.end(); iter++) {
    cout << iter->first << " " << iter->second << endl;
  }
  return 0;
}

输出结果为:

apple 1
banana 2
orange 3

三、迭代器

迭代器是一种通用的数据访问方式,可以方便地遍历STL容器中的元素,常用的迭代器类型有以下几种:

1. Input Iterator

Input Iterator是一个只读的迭代器,它可以对容器中的数据进行遍历和读取,例如:

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> v = {1, 2, 3};
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:1 2 3

2. Output Iterator

Output Iterator是一个只写的迭代器,它可以向容器中写入数据,例如:

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> v = {1, 2, 3};
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    *iter *= 2;
  }
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:2 4 6

3. Forward Iterator

Forward Iterator是一种单向的迭代器,它支持递增和取值操作,例如:

#include <iostream>
#include <forward_list>
using namespace std;
int main() {
  forward_list<int> flist = {1, 2, 3};
  for (auto iter = flist.begin(); iter != flist.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:1 2 3

4. Bidirectional Iterator

Bidirectional Iterator是一种双向的迭代器,它可以向前和向后遍历容器中的元素,例如:

#include <iostream>
#include <list>
using namespace std;
int main() {
  list<int> l = {1, 2, 3};
  for (auto iter = l.rbegin(); iter != l.rend(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:3 2 1

5. Random Access Iterator

Random Access Iterator是一种随机访问的迭代器,可以快速定位到容器中的任意位置,并进行读写操作,例如:

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> v = {1, 2, 3};
  cout << v[1] << endl; // 输出 2
  v[1] = 4;
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:1 4 3

四、算法

算法是STL库中非常重要的一部分,提供了大量的常用算法,包括查找、排序、遍历、合并等操作。

1. 查找

STL库中提供了多种查找算法,包括二分查找、线性查找、查找最大/最小值等。

例如,使用二分查找算法:(前提是数据序列已经排好序)

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
  int a[] = {1, 2, 3, 4, 5};
  cout << binary_search(a, a + 5, 4) << endl; // 输出 1
  return 0;
}

2. 排序

STL库中提供了多种排序算法,包括快速排序、归并排序、堆排序等,其中最常用的是快速排序。

例如,使用快速排序算法:(vector会使用快排)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
  vector<int> v = {3, 1, 4, 2, 5};
  sort(v.begin(), v.end());
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:1 2 3 4 5

3. 遍历

STL库中提供了多种遍历算法,包括for_each、transform等,这些算法可以对容器中的元素进行操作并输出。

例如,使用for_each算法将vector中的每个元素乘以2并输出:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(int n) {
  cout << n * 2 << " ";
}
int main() {
  vector<int> v = {1, 2, 3};
  for_each(v.begin(), v.end(), print);
  return 0;
}

输出结果为:2 4 6

4. 合并

STL库中提供了多种合并算法,包括merge、set_union等,这些算法可以将多个有序的序列合并成一个有序的序列。

例如,使用merge算法将两个vector合并成一个有序的序列并输出:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
  vector<int> v1 = {1, 3, 5};
  vector<int> v2 = {2, 4, 6};
  vector<int> v3(v1.size() + v2.size());
  merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
  for (auto iter = v3.begin(); iter != v3.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:1 2 3 4 5 6

五、函数对象

函数对象是STL库中的一种概念,是一种重载了运算符()的类,可以像函数一样进行调用,可以用于算法中的比较、计算等操作。

1. 比较函数对象

比较函数对象是一种用于比较两个元素大小的函数对象,常用于sort、max_element等算法中。

例如,比较函数对象的实现:

struct cmp {
  bool operator()(int a, int b) const {
    return a < b;
  }
};

使用比较函数对象对vector进行排序:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct cmp {
  bool operator()(int a, int b) const {
    return a < b;
  }
};
int main() {
  vector<int> v = {3, 1, 4, 2, 5};
  sort(v.begin(), v.end(), cmp());
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

输出结果为:1 2 3 4 5

2. 计算函数对象

计算函数对象是一种用于计算表达式的函数对象,常用于accumulate等算法中。

例如,计算函数对象的实现:

struct plus_functor {
  int operator()(int a, int b) const {
    return a + b;
  }
};

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/158954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-19 18:56
下一篇 2024-11-19 18:56

相关推荐

  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python实现爬楼梯算法

    本文介绍使用Python实现爬楼梯算法,该算法用于计算一个人爬n级楼梯有多少种不同的方法。 有一楼梯,小明可以一次走一步、两步或三步。请问小明爬上第 n 级楼梯有多少种不同的爬楼梯…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 数据结构与算法基础青岛大学PPT解析

    本文将从多个方面对数据结构与算法基础青岛大学PPT进行详细的阐述,包括数据类型、集合类型、排序算法、字符串匹配和动态规划等内容。通过对这些内容的解析,读者可以更好地了解数据结构与算…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • 数据结构学生成绩管理系统

    在现代教育中,学生成绩的管理已经成为了一个不可或缺的部分。借助数据结构,一个高效、可靠的学生成绩管理系统可以被轻松实现。 一、数据结构的选择 在构建学生成绩管理系统时,选择合适的数…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • 粒子群算法Python的介绍和实现

    本文将介绍粒子群算法的原理和Python实现方法,将从以下几个方面进行详细阐述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    编程 2025-04-29
  • Python回归算法算例

    本文将从以下几个方面对Python回归算法算例进行详细阐述。 一、回归算法简介 回归算法是数据分析中的一种重要方法,主要用于预测未来或进行趋势分析,通过对历史数据的学习和分析,建立…

    编程 2025-04-28

发表回复

登录后才能评论