Тези алгоритми работят само върху сортирани последователности!!!
struct Concat : unary_function<string, void>
{
void operator()(const string& s)
{
result += s;
}
string result;
} ;
// ...
// v is container of strings
cout << for_each(v.begin(), v.end(), Concat()).result << endl;
cout << accumulate(v.begin(), v.end(), "") << endl;
прилага функцията, подадена му като аргумент, върху всички елементи на една редица и запазва резултата в друга редици
vector<int> v;
transform(v.begin(), v.end(), v.begin(), negate<int>());
// сменя знака на числата във v
vector<int> r;
transform(v.begin(), v.end(), back_inserter(r),
bind1st(plus<int>(), 42));
vector<int> a, b;
transform(a.begin(), a.end(), b.begin(), b.end(),
a.begin(), plus<int>());
// добава b към a почленно
template <typename Iterator>
void sort(Iterator begin, Iterator end);
// сортира използвайки operator< в нарастващ ред
template <typename Iterator, typename Ordering>
void sort(Iterator begin, Iterator end, Ordering c);
// sort използва introsort алгоритъма и изисква random
// access iterators
// Average O(N*logN), Worst case О(N^2)
// за сортиране на list
list<int> l;
l.sort();
l.sort(greater<int>());
template <typename Iterator>
void stable_sort(Iterator begin, Iterator end);
template <typename Iterator, typename Ordering>
void stable_sort(Iterator begin, Iterator end, Ordering c);
// не по-бавно от O(N*logN*logN)
// O(N*logN) ако има достатъчно голям свободен буфер
10-те студента с най-висок успех?
vector<int> v;
// ...
vector<int>::iterator n = v.begin() + 10;
partial_sort(v.begin(), n, v.end());
// сортира [v.begin(), n) - поставя най-малките 10
// елемента сортирани в началото на v
// O(N*logN)
10-тия по успех студент?
vector<int> v;
// ...
vector<int>::iterator n = v.begin() + 10;
nth_element(v.begin(), n, v.end());
// *n ще бъде 10-тото най-малко число
// всички числа в [v.begin(), n) са по-малки или равни на *n
// всички числа в [n + 1, v.end()) са по-големи или равни на *n
// Avarage: O(N)
Връща итератор към първата позиция, в която можем да вмъкнем елемента без да нарушим подредеността на редицата.
lower_bound ИЗИСКВА редицата да е била сортирана
lower_bound прави O(logN) сравнения
lower_bound прави O(logN) стъпки за random access iterator и O(N) за forward
vector<int> v;
// ...
sort(v.begin(), v.end());
int x = g(42);
vector<int>::iterator p = lower_bound(v.begin(), v.end(), x);
if (p != v.end() && !(*p < x || x < *p))
cout << "there is " << x << " in v" << endl;
v.insert(p, x);
// O(logN)
Връща итератор към последната позиция, в която можем да вмъкнем елемента без да нарушим подредеността на редицата. Ако съществува еквивалентен на дадения елемент в редицата,upper_boundсочи точно след последния такъв.
upper_bound има същото поведение както lower_bound относно редицата и итераторите
Връща std::pair отlower_boundиupper_bound
typedef vector<int> Vector;
typedef vector<int> VectorIt;
Vector v;
// ...
sort(v.begin(), v.end());
pair<VectorIt, VectorIt> r = equal_range(v.begin(), v.end(), 42);
if (r.first == r.second)
cout << "42 is not there";
v.insert(r.second, 42);
// вмъква 42
// O(logN)
Връщаtrue/falseрезултат дали даден елемент се среща вСОРТИРАНАредица.
vector<int> v;
// ...
sort(v.begin(), v.end());
if (binary_search(v.begin(), v.end(), 42))
cout << "42 is the Answer" << endl;
// O(logN)
class A { } ;
bool operator==(const A& lhs, const A& rhs);
bool mycmp(const A& x, const A& y) {
return x.better_than(y);
}
vector<A> v;
// ...
sort(v.begin(), v.end(), mycmp);
A x = g(42);
vector<A>::iterator p = lower_bound(v.begin(), v.end(), mycmp);
if (p != v.end() && *p == x)
cout << "there is " << x << " in v" << endl;
vector<int> v;
// ...
int sum = accumulate(v.begin(), v.end(), 0);
// uses operator+
int prod = accumulate(v.begin(), v.end(), 1, multiplies<int>());
vector<int> v;
// ...
int sum = partial_sum(v.begin(), v.end());
// uses operator+
int prod = partial_sum(v.begin(), v.end(), multiplies<int>());
int c = partial_sum(v.begin(), v.end(), Combiner());
Смята разликите между два съседни елемента и ги запазва в друга редица
vector<int> v, r;
// ...
adjacent_difference(v.begin(), v.end(), back_inserter(r));
// r[0] = v[0]
// r[1] = v[1] - v[0];
// r[n+1] = v[n+1] - v[n];
Смята произведението на две редици:
a1*b1 + a2*b2 + ... + aN*bN
vector<double> a, b;
// a и b са вектори зададени с координати в ортогонален базис
double ab = inner_product(a.begin(), a.end(), b.begin(), 0);
// ab е скаларното произведение на двата вектора