Algoritmo de biblioteca estándar STL (explicación detallada del algoritmo de secuencia modificada) aplicación específica de funciones de transformación, partición y generación

Este blog presenta principalmente el algoritmo de secuencia de corrección. Algunas operaciones del algoritmo de secuencia de corrección cambiarán el contenido del contenedor. Por ejemplo, para copiar parte de un contenedor a otra parte del mismo contenedor o para llenar un contenedor con un valor específico.

La siguiente es la tabla del algoritmo de secuencia modificada STL

parámetro ilustrar
copiar (primero, último, primero 2) Copiar
copy_backward (primero, último, final2) replicación inversa
llenar (primero, último, valor) llena el contenedor con el valor de val
generar (primero, último, función) Llena el contenedor con el resultado de la operación de acción especificada
partición (primero, último, anterior) Dividir el contenedor por un punto de división (como un número par)
random_shuffle (primero, último) reordenamiento aleatorio
remove(puño,último,val) quitar un elemento sin borrarlo
reemplazar (puño, último, val, val2)

reemplazar val con val2

retate(primero, medio, ultimo) rotar
inversa (primero, último) Invertir los elementos en el contenedor.
intercambiar (it1, it2) Intercambia los elementos de dos contenedores.
transformar (primero, último, primero 2, función) Basado en dos contenedores, la interacción produce un tercer contenedor
único (primero, último) Haz que los elementos repetidos sean únicos
swap_ranges (primero, último, primero) Reemplazar el rango especificado

El código de implementación específico es el siguiente:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int val)
{
	cout << val << " ";	
} 

int Sum(int a,int b)
{
	return a + b;
}

int random()
{
	return rand() % 100 + 1;
}

bool op(int i)
{
	return i % 2 == 0;
}

int main()
{
	vector<int> ivc1,ivc2;
	cout << "请输入ivc1(ivc2)的元素个数:" << endl;
	int n,x;
	cin >> n; 
	cout << "请输入ivc1的元素个数:" << endl;
	for(int i = 0; i < n; i++)
	{
		cin >> x;
		ivc1.push_back(x);
	}
	cout << "请输入ivc2的元素个数:" << endl;
	for(int i = 0; i < n; i++)
	{
		cin >> x;
		ivc2.push_back(x);
	}
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);
	cout << endl;
	cout << "ivc2:" << endl;
	for_each(ivc2.begin(),ivc2.end(),print);
	cout << endl << endl;
	
	//using copy()
	cout << "After copy():" << endl;
	copy(ivc1.begin(),ivc1.end(),ivc2.begin());
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	//将ivc1复制给ivc2 
	cout << endl;
	cout << "ivc2:"<<endl;
	for_each(ivc2.begin(),ivc2.end(),print);
	cout << endl << endl;
	
	//using reverse
	cout << "After reverse():" << endl;
	reverse(ivc1.begin(),ivc1.end());
	cout << "ivc1:" << endl;		//对ivc1进行颠倒 
	for_each(ivc1.begin(),ivc1.end(),print);
	cout << endl << endl;
	
	//using random_shuffle()
	cout << "After random_shuffle():" << endl;
	random_shuffle(ivc2.begin(),ivc2.end());
	cout << "ivc2:" << endl;		//对ivc2随机排序 
	for_each(ivc2.begin(),ivc2.end(),print);
	cout << endl << endl;
	
	//using unique()
	cout << "After unique():" << endl;
	unique(ivc1.begin(),ivc1.end());
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	//变成与末尾相同的元素 
	cout << endl << endl;
	
	//using swap()
	cout << "After swap():" << endl;
	swap(ivc1,ivc2);		//交换ivc1和ivc2中的元素 
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl;
	cout << "ivc2:" << endl;
	for_each(ivc2.begin(),ivc2.end(),print);	 
	cout << endl << endl;
	
	//using transform
	cout << "After transform():" << endl;
	vector<int> ivc3;
	ivc3.resize(n);			//需要提前给ivc3一个容器大小否则transform保存不住数据 
	transform(ivc1.begin(),ivc1.end(),ivc2.begin(),ivc3.begin(),Sum); 
	cout << "ivc3:" << endl;
	for_each(ivc3.begin(),ivc3.end(),print);	
	cout << endl << endl;
	
	//using copy_backward()
	cout << "After copy_backward():" << endl;
	vector<int> ivc4;
	ivc4.resize(n);
	copy_backward(ivc1.begin(),ivc1.end(),ivc4.end());
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl; 
	cout << "ivc4:" << endl;
	for_each(ivc4.begin(),ivc4.end(),print);	
	cout << endl << endl; 
	
	//using fill()
	cout << "After fill():" << endl;
	fill(ivc4.begin(),ivc4.end(),8);
	cout << "ivc4:" << endl;
	for_each(ivc4.begin(),ivc4.end(),print);	
	cout << endl << endl;
	
	//using generate()
	cout << "After generate():" << endl;
	generate(ivc4.begin(),ivc4.end(),random);	//产生随机数给ivc4 
	cout << "ivc4:" << endl;
	for_each(ivc4.begin(),ivc4.end(),print);	
	cout << endl << endl;
	
	//using remove()
	cout << "After remove():" << endl;
	remove(ivc1.begin(),ivc1.end(),3);	//移除ivc1中值为3的元素 
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl << endl;
	
	//using replace()
	cout << "After replace():" << endl;
	replace(ivc1.begin(),ivc1.end(),5,77);	//将5的值改为77 
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl << endl; 
	
	//using rotate()
	cout << "After rptate():" << endl;
	rotate(ivc1.begin(),ivc1.begin()+3,ivc1.end());	//旋转ivc1 
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),print);	
	cout << endl << endl;
	
	//using partition()
	/*
 *  partition 参数介绍
 *  1. begin迭代器
 *  2. end 迭代器 注意是前开后闭的 [begin, end)
 *  3. pred 是个 callable 类型, 签名如 bool(int v);
 *     partition的返回值q指向第一个不满足 pred 的位置,
 *     最终[begin, q) 符合pred, [q, end) 不符合
 * */
	cout << "After partition():" << endl;
	vector<int>::iterator it;
	vector<int>::iterator bound;
	it = partition(ivc1.begin(),ivc1.end(),op);
	cout << "odd elements:" << endl;
 	for(bound = ivc1.begin(); bound != it; bound++)
 		cout << *bound << " ";
	cout << endl;	
	cout << "even elements:" << endl;
	for( bound = it; bound != ivc1.end(); bound++)
 		cout << *bound << " ";	
	return 0;
}

Los resultados específicos de la operación se muestran en la figura:

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_61886762/article/details/124211611
Recomendado
Clasificación