C++ STL算法

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

未完待续......

猜你喜欢

转载自blog.csdn.net/zbq_tt5/article/details/86504319