Algorithmes communs C++ STL

Table des matières

avant-propos

1. Algorithmes de traversée couramment utilisés

1.1 pour_chacun

1.2 transformation 

2. Algorithmes de recherche courants

2.1 trouver()

2.2 trouver_if

2.3 adjacent_find

2.4 recherche_binaire

2,5 nombre_if

3. Algorithmes de tri couramment utilisés

3.1 Algorithme de brassage random_shuffle

3.2 Fusionner

3.3 Algorithme de tri inverse inversé

Quatrièmement, algorithme de copie et de remplacement couramment utilisé

Cinq algorithmes de génération arithmétique couramment utilisés

5.1 accumuler 

5.2 remplir

Six, algorithme d'ensemble couramment utilisé

6.1 set_intersectionintersection

6.2 set_unionUnion

6.3 set_differenceEnsemble de différences

Résumer


avant-propos

Lorsque vous utilisez l'algorithme STL, vous devez inclure les fichiers d'en-tête pertinents. Il est principalement composé de fichiers d'en-tête <algorithme> <fonctionnel> <numérique>.

1. <algorithme> est le plus grand de tous les fichiers d'en-tête STL, couvrant la comparaison, l'échange, la recherche, les opérations de parcours, la copie, la modification, etc.

2. <numeric> est de petite taille et ne comprend que quelques fonctions de modèle pour des opérations mathématiques simples sur des séquences

3. <fonctionnel> définit certaines classes de modèles pour déclarer des objets de fonction


1. Algorithmes de traversée couramment utilisés

Syntaxe de l'algorithme de traversée :

pour chacun // traverse le conteneur

transformer //Transférer le conteneur vers un autre conteneur

1.1 pour_chacun

Description de la fonction : implémenter un conteneur de traversée

Prototype de fonction :  for each(iterator beg, iterator end, func); // algorithme de traversée pour parcourir les éléments

Ce qui suit est la méthode de parcours avec des fonctions ordinaires et de parcours avec des foncteurs. Il convient de noter que lorsque vous utilisez des fonctions ordinaires , n'ajoutez pas () dans for_each() , car ce qui doit être transmis est l'adresse de la fonction (c'est-à-dire le pointeur de fonction). Lorsque vous utilisez un foncteur , vous devez ajouter () et une classe d'objet anonyme est transmise.

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//常用遍历算法 for_each
//1.普通函数
void print(int a)
{
	cout << a << " ";
}
//仿函数
class print2
{
public:
	void operator()(int a)
	{
		cout << a << " ";
	}
};
void test01()
{
	vector<int>v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	for_each(v.begin(), v.end(), print);//这里print 不加() 因为这里传递的是函数的地址(函数指针)
	cout << endl;
	for_each(v.begin(), v.end(), print2());//这里加() 仿函数是一个类加()是传入一个匿名对象类
}
int main()
{
	test01();
	system("pause");
	return 0;
}

1.2 transformation 

transform(itérateur début1, itérateur fin1, itérateur début2,_func);  

Remarque : le conteneur cible à transporter doit ouvrir de l'espace à l'avance et utiliser resize() pour spécifier la capacité du conteneur, sinon il ne peut pas être transporté normalement.

2. Algorithmes de recherche courants

Syntaxe de l'algorithme de recherche :

1. trouver //trouver un élément

2. find_if //Rechercher des éléments par condition

3. adjacent_find //Rechercher des éléments répétés adjacents

4. binaire_search //Méthode de recherche binaire

5. count // compte le nombre d'éléments

6. count_if // compte le nombre d'éléments par condition

2.1 trouver()

Présentation de la fonction find() : recherche l'élément spécifié, recherche l'itérateur qui renvoie l'élément spécifié et renvoie l'itérateur de fin end() s'il n'est pas trouvé

Prototype de fonction :   find(iterator beg, iterator end, value) ;

Lors de la personnalisation du type de données , vous devez surcharger le signe "==" avant d'utiliser la fonction find() . Ce qui suit est une classe personnalisée. Lorsque vous utilisez find() pour effectuer une recherche, vous devez utiliser le type booléen pour surcharger le signe "==" dans la classe person, et les paramètres passés doivent être déclarés avec const pour empêcher la valeur d'être modifié. Le code ressemble à ceci :

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
class person
{
public:
	person(string name, int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	//重载 == 让底层find知道如何对比person数据类型
	bool operator==(const person &p1)
	{
		if (this->m_name == p1.m_name && this->m_age == p1.m_age)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	string m_name;
	int m_age;
};
void test01()
{
	vector<person>v;
	person p1("张三", 10);
	person p2("李四", 20);
	person p3("王五", 30);
	person p4("赵六", 40);
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	vector<person>::iterator it = find(v.begin(), v.end(), p2);
	if (it == v.end())
	{
		cout << "没有找到" << endl;
	}
	else
	{
		cout << "找到了,姓名:" << it->m_name << " 年龄:" << (*it).m_age << endl;
	}
}
int main()
{
	test01();
	return 0;
}

2.2 trouver_if

Description de la fonction : rechercher des éléments par condition

Prototype de fonction :   find if(iterator beg, iterator end, Pred); // Rechercher des éléments par valeur, renvoyer l'itérateur à la position spécifiée s'il est trouvé, renvoyer la position de fin de l'itérateur s'il n'est pas trouvé

beg : sélecteur de début ; end : sélecteur de fin ; _Pred : fonction ou prédicat (retour du foncteur booléen)

2.3 adjacent_find

Description de la fonction : Rechercher des éléments répétés adjacents

Prototype de fonction :   adjacent_find(iterator beg, iterator end ) ; //Recherche les éléments répétés adjacents et renvoie l'itérateur de la première position de l'élément adjacent

Description de la fonction :  Rechercher si l'élément spécifié existe

Prototype de fonction :  bool binaire_search(iterator beg, iterator end, value) ; //Recherche l'élément spécifié, renvoie true s'il est trouvé, sinon false

Remarque :  non disponible dans les séquences non ordonnées

2,5 nombre_if

Description de la fonction :  Compter le nombre d'éléments par condition

Prototype de fonction : count_if(iterator beg, iterator end, _Pred ) ; // Compter le nombre d'occurrences d'éléments par condition

3. Algorithmes de tri couramment utilisés

Introduction à l'algorithme :

1. sort //Trier les éléments dans le conteneur

2. random_shuffle // Mélange les éléments dans la plage spécifiée pour ajuster l'ordre de manière aléatoire

3. fusionner //Les éléments du conteneur sont fusionnés et stockés dans un autre conteneur

4. reverse //Inverser les éléments de la plage spécifiée

L' algorithme de tri aléatoire random_shuffle , l'algorithme de tri par fusion et l'algorithme de tri inverse   inversé  sont présentés ci-dessous .

3.1 Algorithme de brassage random_shuffle

Algorithme Shuffle : ajustez de manière aléatoire l'ordre des éléments dans la plage spécifiée

Voici le code de démonstration :

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<ctime>
//常用的排序算法 rand_shuffle
void test01()
{
	vector<int>v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	//利用洗牌算法打乱顺序
	random_shuffle(v.begin(), v.end());
	for (vector<int>::iterator it = v.begin();it != v.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
int main()
{
	srand((unsigned int)time(NULL));//加入随机种子
	test01();
	return 0;
}

Le résultat de l'opération est le suivant :

9 7 6 8 2 4 1 3 5 0

3.2 Fusionner

Description de la fonction : Fusionner deux éléments de conteneur et les stocker dans un autre conteneur

Prototype de fonction :   merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); //Les éléments du conteneur sont fusionnés et stockés dans un autre conteneur

REMARQUE :  Les deux conteneurs doivent être en ordre.

Voici le code de démonstration :

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//常用排序算法 merge
void print(int val)
{
	cout << val << " ";
}
void test01()
{
	vector<int>v;
	vector<int>v2;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
		v2.push_back(i+1);
	}
	//将V、V2合并放入新目标容器
	vector<int>vtarget;
	vtarget.resize(v.size()+v2.size());//目标容器提前开辟空间
	merge(v.begin(), v.end(), v2.begin(), v2.end(), vtarget.begin());
	for_each(vtarget.begin(), vtarget.end(), print);
	cout << endl;
}
int main()
{
	test01();
	return 0;
}

Le résultat de l'opération est le suivant :

0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 

3.3 Algorithme de tri inverse inversé

Description de la fonction : Inverser les éléments dans le conteneur

Prototype de fonction :   reverse(iterator beg, iterator end) ; // inverse les éléments dans la plage spécifiée

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//常用排序算法 reverse
void print(int val)
{
	cout << val << " ";
}
void test01()
{
	vector<int>v;
	v.push_back(0);
	v.push_back(3);
	v.push_back(5);
	v.push_back(0);
	v.push_back(4);
	cout << "反转前" << endl;
	for_each(v.begin(), v.end(), print);
	cout << endl;
	cout << "反转后" << endl;
	reverse(v.begin(), v.end());
	for_each(v.begin(), v.end(), print);
	cout << endl;
}
int main()
{
	test01();
	return 0;
}

Le résultat de l'opération est le suivant :

 Avant inversion
0 3 5 0 4
Après inversion
4 0 5 3 0

Quatrièmement, algorithme de copie et de remplacement couramment utilisé

Introduction à l'algorithme :

1. copy //Copier la plage d'éléments spécifiée dans le conteneur vers un autre conteneur

2. replace //Remplacez tous les anciens éléments de la plage spécifiée dans le conteneur par de nouveaux éléments

3. replace_if //Remplacez tous les éléments qui remplissent les conditions dans la plage spécifiée dans le conteneur par de nouveaux éléments

4. swap //Échanger les éléments de deux conteneurs (doivent être du même type)

Cinq algorithmes de génération arithmétique couramment utilisés

Remarque :  L'algorithme de génération arithmétique est un petit algorithme et le fichier d'en-tête inclus lors de son utilisation est #include <numeric>

Introduction à l'algorithme :

accumuler //Calculer la somme cumulée des éléments du conteneur

remplir // ajouter des éléments au conteneur

5.1 accumuler 

Calcule la somme cumulée des éléments du conteneur dans la plage

Prototype de fonction :   accumuler (début de l'itérateur, fin de l'itérateur, valeur); //Calculer la somme cumulée des éléments du conteneur

Parmi eux, la valeur du paramètre 3 est la valeur de départ de l'accumulation (par exemple, si val=100, la valeur avant accumulation est de 100, et elle doit être ajoutée sur la base de 100). 

5.2 remplir

Description de la fonction : Remplissez l'élément spécifié dans le conteneur

Prototype de fonction : fill (début de l'itérateur, fin de l'itérateur, valeur) ; // remplir le conteneur avec des éléments

Où la valeur du paramètre 3 est la valeur remplie

Six, algorithme d'ensemble couramment utilisé

Introduction de l'algorithme : 1. set_intersection // Trouver l'intersection
de deux conteneurs 2. set_union // Trouver l'union de deux conteneurs 3. set_difference // Trouver la différence entre deux conteneurs

6.1 set_intersectionintersection

Voici le code de démonstration :

#include<iostream>
using namespace std;
#include<vector>
#include<numeric>
#include<algorithm>
//常见的集合算法 set_intersection
void print(int val)
{
	cout << val << " ";
}
void test01()
{
	vector<int>v1;
	vector<int>v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i+5);
	}
	vector<int>v3;
	//目标容器提前开辟空间
	v3.resize(min(v1.size(), v2.size()));
	//获取交集
	vector<int>::iterator it=set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), it, print);//结束不用end()迭代器,用it
}
int main()
{
	test01();
	return 0;
}

 Le résultat de l'opération est le suivant :

5 6 7 8 9

Remarque : les deux conteneurs doivent être une séquence ordonnée 

6.2 set_unionUnion

Nom : set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);

L'utilisation de set_union est cohérente avec celle de set_intersection.Il convient de noter que la capacité du conteneur doit ici être modifiée comme suit : v3.resize(v1.size()+v2.size());

Remarque : les deux conteneurs doivent être une séquence ordonnée 

6.3 set_differenceEnsemble de différences

Prototype de fonction :   set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest) ;

Voici le code de démonstration :

#include<iostream>
using namespace std;
#include<vector>
#include<numeric>
#include<algorithm>
//常见的集合算法 set_difference
void print(int val)
{
	cout << val << " ";
}
void test01()
{
	vector<int>v1;
	vector<int>v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}
	vector<int>v3;
	//目标容器提前开辟空间
	v3.resize(max(v1.size(), v2.size()));
	//获取v1对v2的差集
	cout << "v1对v2的差集" << endl;
	vector<int>::iterator it = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), it, print);//结束不用end()迭代器,用it
	cout << endl;
	cout << "v2对v1的差集" << endl;
	it = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v3.begin());
	for_each(v3.begin(), it, print);//结束不用end()迭代器,用it
	cout << endl;
}
int main()
{
	test01();
	return 0;
}

Le résultat de l'opération est le suivant :

Différence de v1 à v2
0 1 2 3 4
Différence de v2 à v1
10 11 12 13 14 

 Remarque : les deux conteneurs doivent être une séquence ordonnée 

おすすめ

転載: blog.csdn.net/m0_74893211/article/details/131996355