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: