Documente Academic
Documente Profesional
Documente Cultură
Aritoni Ovidiu
Algoritmi STL
1. Prezentare general
2. Clasificare:
Algoritmi nechirurgicali ;
Algoritmi chirurgicali ;
Algoritmi de sortare;
Algoritmi generali;
Aritoni Ovidiu
int A[] = { 2, 0, 4, 6, 0, 3, 1, -7 };
const int N = sizeof(A) / sizeof(int);
cout << "Number of zeros: "
<< count(A, A + N, 0)
<< endl;
3.2 Equal
Exemplu
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool mypredicate (int i, int j) {
return (i==j);
}
int main () {
int myints[] = {34,14,62,56,123};
vector<int> myvector (myints,myints+5);
if (equal (myvector.begin(), myvector.end(), myints))
cout << "The contents of both sequences are equal." << endl;
else
cout << "The contents of both sequences differ." << endl;
myvector[3]=81;
if (equal (myvector.begin(), myvector.end(), myints, mypredicate))
cout << "The contents of both sequences are equal." << endl;
else
cout << "The contents of both sequences differ." << endl;
return 0;
}
3.3 Find
Exemplu
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
const string delArr[] = {" ", "\t", "(", ")", "[", "]", "{", "}",
";", "<", ">", "=", "+", "-", "*", "&"};
vector<string> delimiters(delArr,delArr +
sizeof(delArr)/sizeof(delArr[0]));
Aritoni Ovidiu
4.2 Copy
Aritoni Ovidiu
Exemplu
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main () {
int myints[]={140,20,76,40,50,60,70};
vector<int> myvector;
vector<int>::iterator it;
myvector.resize(7);
copy ( myints, myints+7, myvector.begin() );
cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
}
return 0;
4.3 Swap
Exemplu
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main () {
int x=10, y=20;
swap(x,y);
// x:10 y:20
// x:20 y:10
// first:4x20 second:6x10
// first:6x10 second:4x20
return 0;
5. Algoritmi de sortare
sort()
Aritoni Ovidiu
5.1 Merge( )
Merge combin dou ranguri sortate [first1, last1) i [first2, last2) ntr-un singur rang sortat. Adica,
merge copiaza elementele de la [first1, last1) i [first2, last2) n [rezultat, rezultat + (last1 - first1) +
(last2 - first2)), astfel nct rangul rezultat este n ordine strict crescatoare.
Exemplu:
int main()
{
int A1[] = {
int A2[] = {
const int N1
const int N2
1, 3, 5, 7 };
2, 4, 6, 8 };
= sizeof(A1) / sizeof(int);
= sizeof(A2) / sizeof(int);
5.2 Sort ( )
Exemplu
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
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};
vector<int> myvector (myints, myints+8);
Aritoni Ovidiu
vector<int>::iterator it;
// using default comparison (operator <):
sort (myvector.begin(), myvector.begin()+4);
// using function as comp
sort (myvector.begin()+4, myvector.end(), myfunction);
// using object as comp
sort (myvector.begin(), myvector.end(), myobject);
// print out content:
cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
}
6. Algoritmi Generali
accumulate()
- Calculeaza suma, produsul
inner_product()
- Combina toate elementele a 2 ranguri
adjacent_difference()- Combina fiecare element cu predecesorul sau
partial_sum() C
- Combina fiecare elemente cu toti predecesorii sai
6.1 Accumulate()
Acumulate este o generalizare a sumei: calculeaza-o suma (sau alte cteva operatii binare) elementelor
n intervalul [prima, ultima).
Exemplu
int main()
{
int A[] = {1, 2, 3, 4, 5};
const int N = sizeof(A) / sizeof(int);
cout <<
<<
<<
cout <<
<<
<<
elements in A is "
+ N, 0)
all elements in A is "
+ N, 1, multiplies<int>())
6.2 Power
Exemplu
Aritoni Ovidiu
int main() {
cout << "2 ** 30 = " << power(2, 30) << endl;
}
<iostream>
<numeric>
<functional>
<vector>
<iterator>
Aritoni Ovidiu
rgDifferences.end(),
itGT,
less<int>());
cout << "Which adjacent distances are greater:" << endl
<< "(If you have [a,b,c], then you have [1,0] if a>b and b<=c)"
<< endl;
copy(rgGT.begin()+1,rgGT.end(),itOstream);
cout << endl;