欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ STL算法

程序员文章站 2022-07-12 16:31:53
...

标准库定义了一组泛型算法:因为它们实现共同的操作,所以称之为“算法”;而“泛型”指的是它们可以操作在多种容器类型上,不但可作用于标准库类型,还可用在内置数组类型、甚至其他类型的序列上。大多数算法是通过遍历由两个迭代器标记的一段元素来实现其功能。使用泛型算法必须包含头文件 algorithm :

   #include <algorithm>

标准库还定义了一组泛化的算术算法(generalized numeric algorithm),其命名习惯与泛型算法相同。使用这些算法则必须包numeric头文件:

   #include <numeric>

区别带一个函数参数的算法版本:大部分算法会提供比较或测试函数取代操作符使用的版本,此版本在名字中加了 _if 后缀。

区别是否实现复制的算法版本:很多算法将重新排列的元素写回其输入范围。标准库提供了复制版本,此版本的算法在名字中添加了 _copy 后缀。

迭代器实参类型

通常泛型算法都是在标记容器(或其他序列)内的元素范围的迭代器上操作的。标记范围的两个实参类型必须精确匹配,它们必须指向同一个容器中的元素(或者超出容器末端的下一位置),并且如果两者不相等,则第一个迭代器通过不断地自增,必须可以到达第二个迭代器。对于带有两对迭代器参数的算法,如find_first_of:每对迭代器中,两个实参的类型必须精确匹配,但不要求两对之间的类型匹配。特别是,元素可存储在不同类型序列中,只要这两序列的元素可以比较即可。

 

一、只读算法

查找算法:

1.find函数:查找第一次出现的目标字符串:

#include<string>
#include <list>
#include <algorithm>

int main (void){
   list<string> Fruit;
   list<string>::iterator FruitIterator;

   Fruit.push_back("Apple");
   Fruit.push_back("Pineapple");
   Fruit.push_back("Star Apple");

   FruitIterator = find (Fruit.begin(), Fruit.end(),"Pineapple");
 
   if (FruitIterator == Fruit.end()) {
       cout << "Fruit not found in list" << endl;
    }
   else {
       cout<< *FruitIterator <<endl;
    }
}

输出是:

Pineapple

如果没有找到指出的对象,就会返回Fruit.end()的值,要是找到了就返回一个指着找到的对象的iterator。

2.find_first_of():查找子串中的某个字符最先出现的位置。

   find_first_of()不是全匹配,而find()是全匹配

3.find_last_of():这个函数与find_first_of()功能差不多,只不过find_first_of()是从字符串的前面往后面搜索,而find_last_of()是从字符串的后面往前面搜索。

4.rfind():反向查找字符串,即找到最后一个与子串匹配的位置

5.find_first_not_of():找到第一个不与子串匹配的位置
 

未完待续......