STL标准模版库之算法(algorithm)

2023-05-16

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。

STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>.

目录

1. 算法(algorithm)基本概念

1.1 非修正序列算法

1.2 修正序列算法

1.3 排序算法

1.4 数值算法


1. 算法(algorithm)基本概念

算法(algorithm)是STL的中枢,STL提供了算法库,算法库中都是模版函数,迭代器主要负责从容器中获取一个对象,算法与具体对象在容器中的位置等细节无关,每种算法都是参数化一个或多个迭代器类型的函数模版。‘

标准算法分为4类:非修正序列算法、修正序列算法、排序算法和数值算法。

1.1 非修正序列算法

非修改序列算法:不修改它们所作用的容器,如计算元素个数或查找元素的函数。STL中提供的非修正序列算法有adjacent_find(first,last),count、equal等。

代码示例如下:

adjacent_find:搜索相邻的重复元素

    multiset<int, less<int>> intSet;
	intSet.insert(1);
	intSet.insert(3);
	intSet.insert(6);
	intSet.insert(3);
	intSet.insert(6);
	//intSet.insert(3);

	cout << "Set:" << " ";
	multiset<int, less<int>>::iterator it = intSet.begin();
	for (int i = 0; i < intSet.size(); i++)
	{
		cout << *it++ << ' ';
	}

	cout << endl;
	cout << "第一次匹配:";
	//查找重复的元素
	it = adjacent_find(intSet.begin(),intSet.end());
	cout << *it++ << ' ';
	cout << *it << endl;
	cout << "第二次匹配:";
	it = adjacent_find(it,intSet.end());
	cout << *it++ << ' ';
	cout << *it << endl;

count:计数

    multiset<int, less<int>> intSet;
	intSet.insert(1);
	intSet.insert(3);
	intSet.insert(6);
	intSet.insert(3);
	intSet.insert(6);
	//intSet.insert(3);

	cout << "Set:" << " ";
	multiset<int, less<int>>::iterator it = intSet.begin();
	for (int i = 0; i < intSet.size(); i++)
	{
		cout << *it++ << ' ';
	}

	int num = count(intSet.begin(),intSet.end(),3);
	cout << "相同元素数据:" << num << endl;

for_each(first,last,func):对first到last范围的各个元素执行函数func定义的操作


void Output(int val)
{
	cout << val << ' ';
}

void test_algorithm_03(void)
{
	multiset<int, less<int>> intSet;
	intSet.insert(1);
	intSet.insert(3);
	intSet.insert(6);

	cout << "Set:" << " ";
	for_each(intSet.begin(), intSet.end(),Output);
	cout << endl;

}

 

 

1.2 修正序列算法

修正序列算法:有一些 操作会改变容器的内容,例如把一个容器的部分内容复制到同一个容器的另一部分,或者用指定值填充容器,例如copy、fill、reverse、remove等。

代码示例如下:

fill:改填元素值

vector<int> intVect;
for (int i = 0; i < 10; i++)
{
	intVect.push_back(i);
}
cout << "Vect:";
for_each(intVect.begin(), intVect.end(), Output);
fill(intVect.begin(), intVect.begin() + 5, 0);
cout << endl;
cout << "Vect:";
for_each(intVect.begin(),intVect.end(), Output);
cout << endl;

rotate:旋转

    vector<char> charVect;
	charVect.push_back('C');
	charVect.push_back('B');
	charVect.push_back(' ');
	charVect.push_back('H');
	charVect.push_back('R');
	charVect.push_back(' ');
	charVect.push_back('G');

	cout << "Vect:";
	for_each(charVect.begin(), charVect.end(), Output);
	rotate(charVect.begin(),charVect.begin()+6,charVect.end());
	cout << endl;
	cout << "Vect:";
	for_each(charVect.begin(), charVect.end(), Output);
	cout << endl;

 

1.3 排序算法

排序算法:是对容器的内容进行不同方式的排序,例如sort等。

代码示例如下:

sort:排序从大到小

    vector<char> charVect;
	charVect.push_back('C');
	charVect.push_back('B');
	charVect.push_back('D');
	charVect.push_back('H');
	charVect.push_back('R');
	charVect.push_back('A');
	charVect.push_back('G');

	cout << "Vect:";
	for_each(charVect.begin(), charVect.end(), Output);
	sort(charVect.begin(), charVect.end());
	cout << endl;
	cout << "Vect:";
	for_each(charVect.begin(), charVect.end(), Output);
	cout << endl;

 

1.4 数值算法

数值算法:是对容器的内容进行计算,STL的数值算法实现了4中类型的计算,可以在一个值序列上进行这些计算。

示例代码如下:

accumulate:元素累加

	vector<int> intVect;
	for (int i = 0; i < 5; i++)
	{
		intVect.push_back(i);
	}
	cout << "Vect:";
	for_each(intVect.begin(), intVect.end(), Output);
	int result = accumulate(intVect.begin(),intVect.end(),5);
	cout << endl;
	cout << "Result:" << result << endl;

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL标准模版库之算法(algorithm) 的相关文章

  • 为什么《破解编码面试》这个例子的时间复杂度是O(k c^k)?

    该问题来自 破解编码面试 第 6 版 问题 V1 11 以下代码打印长度为 k 的所有字符串 其中字符 是按排序顺序排列的 它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序 什么是运行时间 package QVI 11 P
  • Python 中的空填字游戏求解器

    我得到了一个包含填字游戏蓝图的矩阵 当然 它是空的 我们的目标是填补整个难题 这是 Checkio 的一项任务 我已经为此奋斗了相当长一段时间 根据我对复杂性的理解 这个问题没有完美的算法 不过 必须有最好的方法来做到这一点 对吧 我尝试了
  • 快速排序应用程序中这些交换代码行的目的是什么?

    我试图理解快速排序的实现或应用程序以找到第 k 个最小元素 这是我试图理解的代码 public int quicksort int a int start int end int k if start lt end int pivot pa
  • 使用 Numba 加速矢量距离计算

    以下是我为 3 D 环形几何中的距离 平方 计算编写的一些函数 用于该 3 D 空间中的粒子集合 import itertools import time import numpy as np import scipy import num
  • 更合适地说插入未排序动态数组的摊销 O(1) 与 O(n) ?

    这属于 stackoverflow com help on topic 中的 软件算法 在本例中 是一种将项目添加到动态未排序数组的软件算法 This is chart we made in class about the runtimes
  • lambda 是否像 C++ 中的函数一样内联?

    编译器是否可以内联 lambda 函数来提高效率 就像使用简单的标准函数一样 e g std vector
  • 填充体积算法

    我有一个具有一定尺寸长度 宽度 高度的盒子 我有不同长度 宽度 高度的物品 是否有现有的算法可以确定放入盒子中的最佳物品 这称为装箱 切割库存 背包问题 并且是 NP 难问题 一般来说 您只能通过使用启发式方法获得近似解 请参见示例 htt
  • 计算字符串的所有子串中子序列的出现次数

    我想编写一个算法来计算字符串的所有子字符串中字符子序列 不相交 出现的总数 下面是一个例子 字符串 jabcohnnyjohnny 后续 约翰尼 包含子序列的子字符串 jabcohnny jabcohnnyj jabcohnnyjo jab
  • 简单的排名算法

    我需要创建一个民意调查 按照项目的好坏顺序创建一个排名列表 我打算向每个用户展示两个项目 让他们选择一个他们认为更好的项目 然后多次重复这个过程 它有点类似于您在社交网络电影 我应该如何根据收到的答案对项目进行排名 看着那 这ELO国际象棋
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • Python Pandas:沿一列比较两个数据帧,并返回另一个数据帧中两个数据帧的行内容

    我正在处理两个 csv 文件并作为数据框 df1 和 df2 导入 df1 有 50000 行 df2 有 150000 行 我想将 df2 的 时间 与 df1 求时间差并返回所有列的值 对应相似的行 保存在df3中 时间同步 例如 35
  • 矩阵循环移位

    有谁知道对矩阵进行右循环移位的有效方法 顺便说一句 矩阵是二元矩阵 但求解非二元矩阵的方法也很好 现在 我正在考虑为矩阵的行实现一个圆形数组 并在需要移位操作时更新每一行 我正在考虑的另一种方法是实现一个指向由向量表示的列 矩阵 的指针向量
  • Java 2d 游戏中的路径查找?

    本质上它是我正在开发的一款吃豆人克隆游戏 我有一个 Enemy 类 并创建了该类的 4 个实例 它们都代表游戏的 4 个幽灵 所有幽灵都会在屏幕的随机区域启动 然后它们必须朝着吃豆人角色前进 当玩家控制吃豆人并移动它时 他们应该跟随它并尽可
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在Android Studio gradle项目中使用NDK和STL

    我在将 stlport 链接到 Android Studio 中的 gradle 项目时遇到问题 使用 NDK 的 Eclipse Android 项目迁移到 Android Studio 该项目使用 STL 我有包含内容的 android
  • 在树结构的 Big-O 表示法中:为什么有些来源引用 O(logN),有些来源引用 O(h)?

    在研究遍历二叉搜索树的任何算法的复杂性时 我看到两种不同的方式来表达同一件事 版本 1 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O h 版本 2 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O logN
  • std::unique_ptr 是否需要知道 T 的完整定义?

    我的标题中有一些代码 如下所示 include
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐