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) 的相关文章

  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • 寻找簇的中心

    我有以下问题 进行抽象以找出关键问题 我有 10 个点 每个点与其他点有一定距离 我想要 能够找到簇的中心 即与其他点的成对距离最小的点 令 p j p k 表示点 j 和 k 之间的成对距离p i 是簇的中心点 iff p i s t m
  • 按步长值变化对数组中的数字进行分组

    我有一个像 101 107 106 199 204 205 207 306 310 312 312 314 317 318 380 377 379 382 466 469 471 472 557 559 562 566 569 在这个数组中
  • 生成 2D 中的非简并点集 - C++

    我想在 2D 平面中创建一大组非退化的随机点云 整个集合中没有 3 个点在一条直线上 我有一个简单的解决方案 它生成一个随机浮点对 P new x y 并检查到目前为止生成的每对点 P1 P2 是否位于同一行 这需要 O n 2 检查添加到
  • 下界比较函数

    我有以下结构 enum quality good 0 bad uncertain struct Value int time int value quality qual class MyClass public MyClass Inser
  • 分组符号最大长度平衡子序列

    将 B 视为分组符号 和 的序列 如果 B 的长度为 0 或 B 具有以下形式之一 则称 B 为平衡序列 X Y 或 X Y 或 X Y 其中 X 和 Y 本身是平衡的 平衡示例 现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子
  • 计算给出数组中最小标准差的子集

    让我们有一个大小的向量N 例如 x rand N 1 我想计算长度子集的最小标准差K在向量中 When N and K很小 很容易找到最好的子集 因为我可以使用nchoosek N K 枚举所有可能的子集 但是当值N and K比我们说的要
  • 获取 const 引用的迭代器

    我正在开发一个必须返回一个迭代器的类begin 方法 另外 我必须开发一个函数来接收此类的 const 引用并对其进行迭代 当我尝试从此方法获取迭代器时 出现以下编译错误 the object has type qualifiers tha
  • C++ 映射插入和查找性能和存储开销

    我想存储一个映射integer的关键float内存中的值 我大约有 1 3 亿个键 相应地 也有 1 3 亿个值 我的重点是查找性能 我必须进行数百万次查找 C STL 库有一个map此类关联数组的类 我有几个问题map 存储开销是多少ma
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • STL 映射和集合中的排序顺序

    用户定义的对象在map和set中是如何排序的 据我所知 映射 集合是排序关联容器 插入的元素根据它所持有的键进行排序 但map和set内部使用operator gt 对它们的元素进行排序 从 SGI 网站上 我有以下示例 struct lt
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 查找数组中的重叠数据

    我们正在编写一个 C 应用程序 它将有助于删除不必要的数据重复器 只有在以下情况下才可以移除中继器 all它接收到的数据被其他中继器接收 我们第一步需要做的事情解释如下 例如 我有 int 数组的集合 A 1 2 3 4 5 b 2 4 6
  • 计算总和等于 k ​​的子集数量

    给定一个数组 我们需要找出总和恰好等于给定整数 k 的子集的数量 请针对这个问题提出一个最佳算法 这里不需要实际的子集 只需计数即可 该数组由整数组成 可以是负数也可以是非负数 例子 数组 gt 1 4 1 10 5 绝对值总和 gt 9
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • CSR 矩阵 - 矩阵乘法

    我有两个方阵A and B 我必须转换B to CSR Format并确定产品C A B csr C 我在网上找到了很多关于CSR 矩阵 向量乘法 http www mathcs emory edu cheung Courses 561 S
  • 模式识别算法

    过去我必须开发一个充当规则评估器的程序 你有一个先行词和一些后续词 动作 所以如果先行词评估为真 则执行的动作 当时我用的是修改版RETE算法 http en wikipedia org wiki Rete algorithm RETE 有
  • 找到一个恰好出现了 N/2 次的数字

    这是我的面试问题之一 给定一个包含 N 个元素的数组以及元素出现的位置正好 N 2次 其余 N 2 个元素是unique 您如何找到运行时间更好的元素 请记住 元素未排序 您可以假设 N 是偶数 例如 input array 10 2 3
  • 寻找 5 字节 PRNG 的种子

    这是一个古老的想法 但从那时起我就无法找到一些相当好的方法来解决它提出的问题 所以我 发明 了 见下文 一个非常紧凑的 在我看来 性能相当好的 PRNG 但我无法找出算法来为其在大位深度上构建合适的种子值 我当前的解决方案只是暴力破解 它的
  • javascript - 找到在一定限制下给出最大总和的子集(子集总和)

    我有一个包含一些整数值的数组 我需要获取它们的子集 该子集给出小于给定值的最大总和 假设我有这个数组 40 138 29 450 我想获得该数组的一个子集 使总和最大化 但低于用户给出的限制 比如说 250 在这种情况下 它应该返回 139

随机推荐