标准模板库:算法
头文件<algorithm>定义了一组专门设计用于元素范围的函数集合。

范围是可以通过迭代器或指针访问的任何对象序列,例如数组或某些STL容器的实例。 但是请注意,算法通过迭代器直接对值进行操作,而不以任何方式影响任何可能容器的结构(它从不影响容器的大小或存储分配)。

参考手册:cplusplus.com

具体包括  1、非修改序列操作  2、修改序列的操作  3、分区操作  4、排序操作 5、二分查找操作  6、合并操作

7、堆操作  8、最大最小值操作  9、其它操作

这里列举几个常见操作:

1、reverse()

// reverse algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::reverse
#include <vector>       // std::vector

int main () {
  std::vector<int> myvector;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i);   // 1 2 3 4 5 6 7 8 9

  std::reverse(myvector.begin(),myvector.end());    // 9 8 7 6 5 4 3 2 1

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

2、next_permutation(),返回大于等于当前序列的全排列

#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
    int a[3]={1, 2, 3};
    printf("%d %d %d\n",a[0],a[1],a[2]);
    while(next_permutation(a,a+3)){
        printf("%d %d %d\n",a[0],a[1],a[2]);
    }
    return 0;
}

如果将输入序列变成,3, 1,  2   ,那么最后全排列的结果就发生了变化

3、sort()

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

为了展示sort的实际应用场景,这里再加一个案例。

设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。

通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果。

五名英雄信息如下:

		{"刘备",23,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"},

首先定义Hero.h

#pragma once
#ifndef HERO_TYPE_01_
#define HERO_TYPE_01_
#include <string>
#include <iostream>
struct Hero
{
	std::string name;
	int age;
	bool sex;
};

void sort_hero(Hero heros[], int len);

void print_hero_list(Hero heros[], int len);

#endif

然后是Hero.cpp关于Hero.h的实现

# include "hero.h"
# include <algorithm>
# include <vector>
bool myfunc(Hero HA, Hero HB)
{
	return HA.age > HB.age;
}

void sort_hero(Hero heros[], int len)
{
	// 定义一个vector向量,将结构体的数据放入到vector,在algorithm的参数里面要求为Random-access iterators
	std::vector<Hero>vec_heros(heros, heros + len);
	// 通过内置算法进行排序
	std::sort(vec_heros.begin(), vec_heros.end(), myfunc);
	// 将排序的vector结果拷贝给heros数组
	for (size_t i = 0; i < len; i++)
	{
		heros[i] = vec_heros[i];
	}
}

void print_hero_list(Hero heros[], int len)
{
	for (size_t i = 0; i < len; i++)
	{
		std::cout << "name=" << heros[i].name << " age=" << heros[i].age << " sex=" << heros[i].sex << std::endl;
	}
}

主函数

#include <iostream>
#include "hero.h"
using namespace std;

int main()
{
	struct Hero heros[5] = {
		{ "刘备",23,"男" },
		{ "关羽",22,"男" },
		{ "张飞",20,"男" },
		{ "赵云",21,"男" },
		{ "貂蝉",19,"女" },
	};

	int len = sizeof(heros) / sizeof(Hero); //获取数组元素个数

	sort_hero(heros, len); //排序

	print_hero_list(heros, len); //打印

	system("pause");
	return 0;
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐