Purpose of this repository is to introduce and show example usages of C++ STL algorithms. This is a work in progress. Fork, copy, edit, contribute, distribute or do whatever you want. Let's make it a useful repository for everyone!
g++ --std=c++17 stl.cpp
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 9, 10};
// Make a heap from a collection
// More @ https://en.cppreference.com/w/cpp/algorithm/make_heap
std::make_heap(numbers.begin(), numbers.end());
std::cout << "make_heap ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Push to heap
// More @ https://en.cppreference.com/w/cpp/algorithm/push_heap
numbers.push_back(8);
std::push_heap(numbers.begin(), numbers.end());
std::cout << "push_heap ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Pop heap
// More @ https://en.cppreference.com/w/cpp/algorithm/pop_heap
std::pop_heap(numbers.begin(), numbers.end());
std::cout << "pop_heap ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
make_heap 10 9 7 4 5 6 3 2 1
push_heap 10 9 7 4 8 6 3 2 1 5
pop_heap 9 8 7 4 5 6 3 2 1 10
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 9, 10};
// Shuffle for demo purpose
std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(0));
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Basic sort
// More @ https://en.cppreference.com/w/cpp/algorithm/sort
std::cout << "sort ";
std::sort(numbers.begin(), numbers.end());
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Shuffle for demo purpose
std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(0));
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Partial sort
// More @ https://en.cppreference.com/w/cpp/algorithm/partial_sort
std::cout << "partial_sort ";
std::partial_sort(numbers.begin(), numbers.begin() + 5, numbers.end());
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Shuffle for demo purpose
std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(0));
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// n'th element sort - element that would be in n'th position if the collection was sorted
// More at https://en.cppreference.com/w/cpp/algorithm/nth_element
std::cout << "nth_element ";
std::nth_element(numbers.begin(), numbers.begin() + 5, numbers.end());
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Shuffle for demo purpose
std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(0));
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Sort heap
// More @ https://en.cppreference.com/w/cpp/algorithm/sort_heap
std::make_heap(numbers.begin(), numbers.end());
std::sort_heap(numbers.begin(), numbers.end());
std::cout << "sort_heap ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Shuffle for demo purpose
std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(0));
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Inplace Merge
// More @ https://en.cppreference.com/w/cpp/algorithm/inplace_merge
std::sort(numbers.begin(), numbers.begin() + 5);
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::cout << "Current State ";
std::sort(numbers.begin() + 5, numbers.end());
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::inplace_merge(numbers.begin(), numbers.begin() + 5, numbers.end());
std::cout << "inplace_merge ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
Current State 4 1 5 9 6 2 10 7 3
sort 1 2 3 4 5 6 7 9 10
Current State 4 1 5 9 6 2 10 7 3
partial_sort 1 2 3 4 5 9 10 7 6
Current State 4 1 5 7 9 2 6 10 3
nth_element 3 1 2 4 5 6 7 10 9
Current State 4 3 5 10 6 1 9 7 2
sort_heap 1 2 3 4 5 6 7 9 10
Current State 4 1 5 9 6 2 10 7 3
Current State 1 4 5 6 9 2 10 7 3
Current State 1 4 5 6 9 2 3 7 10
inplace_merge 1 2 3 4 5 6 7 9 10
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 9, 10};
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// Partition - reorder the input so that elements satisfying the predicate are clustered at the beginning
// More @ https://en.cppreference.com/w/cpp/algorithm/partition
auto it = std::partition(numbers.begin(), numbers.end(), [](int i){return i % 2 == 0;});
std::cout << "After partition ";
for(auto& i : numbers) std::cout << i << " "; std::cout << std::endl;
// Returned iterator points to first element that doesn't satisfy the predicate
std::cout << "Returned iterator " << *it << std::endl;
// Parititon point - return pointer to first element that doesn't satisfy the predicate partition point
// This function doesn't modity the elements, only locates the pointer
// More @ https://en.cppreference.com/w/cpp/algorithm/partition_point
auto p = std::partition_point(numbers.begin(), numbers.end(), [](int i){ return i % 2 == 0; });
std::cout << "Partition pointer " << *p << std::endl;
Current State 1 2 3 4 5 6 7 9 10
After partition 10 2 6 4 5 3 7 9 1
Returned iterator 5
Partition pointer 5
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// rotate - rotate the container (like a belt)
// More @ https://en.cppreference.com/w/cpp/algorithm/rotate
std::rotate(numbers.begin(), numbers.begin() + 1, numbers.end());
std::cout << "rotate ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::rotate(numbers.begin(), numbers.begin() + 1, numbers.end());
std::cout << "rotate ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// shuffle - shuffle elements (values of elements) in container
// More @ https://en.cppreference.com/w/cpp/algorithm/random_shuffle
std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(0));
std::cout << "shuffle ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// next_permutation - get next permutation of container
// More @ https://en.cppreference.com/w/cpp/algorithm/next_permutation
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::next_permutation(numbers.begin(), numbers.end());
std::cout << "next_permutation ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// prev_permutation - get previous permutation
// More @ https://en.cppreference.com/w/cpp/algorithm/prev_permutation
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::prev_permutation(numbers.begin(), numbers.end());
std::cout << "next_permutation ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// reverse - reverse the container
// More @ https://en.cppreference.com/w/cpp/algorithm/reverse
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::reverse(numbers.begin(), numbers.end());
std::cout << "reverse ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
rotate 2 3 4 5 6 7 8 9 10 1
rotate 3 4 5 6 7 8 9 10 1 2
shuffle 5 10 4 9 1 3 7 2 8 6
Current State 5 10 4 9 1 3 7 2 8 6
next_permutation 5 10 4 9 1 3 7 6 2 8
Current State 5 10 4 9 1 3 7 6 2 8
next_permutation 5 10 4 9 1 3 7 2 8 6
Current State 5 10 4 9 1 3 7 2 8 6
reverse 6 8 2 7 3 1 9 4 10 5
std::vector<std::string> animals_sort = {"elephant", "mouse", "rat", "pig", "dog", "cat", "ant", "moth"};
std::vector<std::string> animals_stable_sort = {"elephant", "mouse", "rat", "pig", "dog", "cat", "ant", "moth"};
// sorts container with given predicate, physical order is not guaranteed in case of equal elements
// More @ https://en.cppreference.com/w/cpp/algorithm/sort
std::sort(animals_sort.begin(), animals_sort.end(), [](const auto& a, const auto& b) { return a.size () < b.size (); });
std::cout << "sort ";
for(auto& i : animals_sort) std::cout << i << " ";
std::cout << std::endl;
// sorts container with given predicate, physical order is not guaranteed in case of equal elements
// More @ https://en.cppreference.com/w/cpp/algorithm/stable_sort
std::stable_sort(animals_stable_sort.begin(), animals_stable_sort.end(), [](const auto& a, const auto& b) { return a.size () < b.size (); });
std::cout << "stable_sort ";
for(auto& i : animals_stable_sort) std::cout << i << " ";
std::cout << std::endl;
// Explanation: predicate on sorting is length of string. In this case, "rat", "pig", "dog", "cat" and "ant" all have same length
// Since they are same length, second condition on sorting will be the physical order. In stable_sort is it guarranteed.
sort rat pig dog cat ant moth mouse elephant
stable_sort rat pig dog cat ant moth mouse elephant
std::vector<int> numbers = {1, 3, 5, 7, 2, 4, 6, 8, 9, 10};
// is_sorted - checks if container is sorted or not
// More @ https://en.cppreference.com/w/cpp/algorithm/is_sorted
bool is_sorted = std::is_sorted(numbers.begin(), numbers.end());
std::cout << "Is sorted? " << is_sorted << std::endl;
std::sort(numbers.begin(), numbers.end());
is_sorted = std::is_sorted(numbers.begin(), numbers.end());
std::cout << "Is sorted? " << is_sorted << std::endl;
// is_heap - checks if container is a heap (BFS of Heap)
// More @ https://en.cppreference.com/w/cpp/algorithm/is_heap
bool is_heap = std::is_heap(numbers.begin(), numbers.end());
std::cout << "Is heap? " << is_heap << std::endl;
std::make_heap(numbers.begin(), numbers.end());
is_heap = std::is_heap(numbers.begin(), numbers.end());
std::cout << "Is heap? " << is_heap << std::endl;
// is_partitioned - returns true if all elements satisfy the predicate
// More @ https://en.cppreference.com/w/cpp/algorithm/is_partitioned
bool is_partitioned = std::is_partitioned(numbers.begin(), numbers.end(), [](int i){ return i > 0; });
std::cout << "Predicate: is positive? " << is_partitioned << std::endl;
Is sorted? 0
Is sorted? 1
Is heap? 0
Is heap? 1
Predicate: is positive? 1
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// is_sorted_until
// More @ https://en.cppreference.com/w/cpp/algorithm/is_sorted_until
auto sorted = std::is_sorted_until(numbers.begin(), numbers.end());
if(sorted != numbers.end()) std::cout << "Is sorted until " << *sorted << std::endl;
else std::cout << "Is sorted until the end" << std::endl;
// is_heap_until
// More @ https://en.cppreference.com/w/cpp/algorithm/is_heap_until
auto heap = std::is_heap_until(numbers.begin(), numbers.end());
if(heap != numbers.end()) std::cout << "Is heap until " << *heap << std::endl;
else std::cout << "Is heap until the end" << std::endl;
Current State 1 2 3 4 5 6 7 8 9 10
Is sorted until the end
Is heap until 2
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// count
int count = std::count(numbers.begin(), numbers.end(), 5);
std::cout << "Count of 5 = " << count << std::endl;
numbers.push_back(5);
count = std::count(numbers.begin(), numbers.end(), 5);
std::cout << "Count of 5 = " << count << std::endl;
// accumulate
int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
std::cout << "Sum of numbers in vector = " << sum << std::endl;
// reduce
// auto reduce = std::reduce(std::execution::par, numbers.begin(), numbers.end());
// std::cout << "reduce " << reduce << std::endl;
// transform_reduce
// partial_sum
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::partial_sum(numbers.begin(), numbers.end(), numbers.begin());
std::cout << "partial_sum ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// inclusive_scan
// std::inclusive_scan(numbers.begin(), numbers.end(), numbers.begin());
// transform_inclusive_scan
// exclusive_scan
// transform_exclusive_scan
// inner_product
auto inner_product = std::inner_product(numbers.begin(), numbers.end(), numbers.begin(), 0);
std::cout << "Inner Product: " << inner_product << std::endl;
// adjacent_difference
std::adjacent_difference(numbers.begin(), numbers.end(), numbers.begin());
std::cout << "Adjacent Difference "; for(auto& i : numbers) std::cout << i << " "; std::cout << std::endl;
// sample -
// More at
std::vector<int> sample(5);
std::sample(numbers.begin(), numbers.end(), sample.begin(), sample.size(), std::default_random_engine(0));
std::cout << "Random Sample "; for(auto& i : sample) std::cout << i << " "; std::cout << std::endl;
// all_of
if (std::all_of(numbers.cbegin(), numbers.cend(), [](int i){ return i > 0; }))
std::cout << "All of numbers are posivite" << std::endl;
// any_of
if (std::any_of(numbers.cbegin(), numbers.cend(), [](int i){ return i % 2 == 0; }))
std::cout << "At least one of numbers is even" << std::endl;
// none_of
if (std::none_of(numbers.cbegin(), numbers.cend(), [](int i){ return i < 0; }))
std::cout << "None of numbers are negative" << std::endl;
// equal
// More at
std::string word = "radar";
if(std::equal(word.begin(), word.begin() + word.size()/2, word.rbegin()))
std::cout << word << " is palindrome" << std::endl;
else
std::cout << word << " is not palindrome" << std::endl;
// is_permutation
std::string word_one = "apple", word_two = "paple";
if(std::is_permutation(word_one.begin(), word_one.end(), word_two.begin()))
std::cout << word_one << " is permutation of " << word_two << std::endl;
else
std::cout << word_one << " is not permutation of " << word_two << std::endl;
// lexicographical_compare
if(std::lexicographical_compare(word_one.begin(), word_one.end(), word_two.begin(), word_two.end()))
std::cout << word_one << " is lexicographically less than " << word_two << std::endl;
else
std::cout << word_one << " is lexicographically more than " << word_two << std::endl;
// mismatch
std::vector<int> numbers_one = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> numbers_two = {1, 2, 3, 4, 5, 7, 8, 9, 10, 11};
auto mismatch = std::mismatch(numbers_one.begin(), numbers_one.end(), numbers_two.begin());
std::cout << "mismatch at " << *mismatch.first << " of first and " << *mismatch.second << " of second" << std::endl;
// find
// More at
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
int find_number = 5;
if(std::find(numbers.begin(), numbers.end(), find_number) != numbers.end())
std::cout << "Found " << find_number << std::endl;
else
std::cout << "Could't find " << find_number << std::endl;
std::sort(numbers.begin(), numbers.end());
// adjacent_find
auto adj_it = std::adjacent_find(numbers.begin(), numbers.end());
if(adj_it != numbers.end())
std::cout << "Found adjacent " << *adj_it << "\'s in collection" << std::endl;
else
std::cout << "Couldn't find adjacent elements in collection" << std::endl;
// equal_range
numbers = {1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 8, 9};
find_number = 5;
auto equal_range = std::equal_range(numbers.begin(), numbers.end(), find_number);
std::cout << "First element of equal_range " << *equal_range.first << ", last element of equal range " << *equal_range.second << std::endl;
// lower_bound
auto lower_bound = std::lower_bound(numbers.begin(), numbers.end(), find_number);
std::cout << "Lower bound on finding " << find_number << " is " << *lower_bound << std::endl;
// upper_bound
auto upper_bound = std::upper_bound(numbers.begin(), numbers.end(), find_number);
std::cout << "Upper bound on finding " << find_number << " is " << *upper_bound << std::endl;
// binary_search
if(std::binary_search(numbers.begin(), numbers.end(), find_number))
std::cout << find_number << " is in the container" << std::endl;
else
std::cout << find_number << " is not in the container" << std::endl;
// search
// find_end
// find_first_of
// max_element - returns pointer to max element of the container
auto max_element = std::max_element(numbers.begin(), numbers.end());
std::cout << "max_element " << *max_element << std::endl;
// min_element - returns pointer to min element of the container
auto min_element = std::min_element(numbers.begin(), numbers.end());
std::cout << "min_element " << *min_element << std::endl;
// minmax_element - returns a pair of pointers to min and max elements
auto minmax_element = std::minmax_element(numbers.begin(), numbers.end());
std::cout << "min_element " << *minmax_element.first << " max_element " << *minmax_element.second << std::endl;
Count of 5 = 1
Count of 5 = 2
Sum of numbers in vector = 60
Current State 1 2 3 4 5 6 7 8 9 10 5
partial_sum 1 3 6 10 15 21 28 36 45 55 60
Inner Product: 11542
Adjacent Difference 1 2 3 4 5 6 7 8 9 10 5
Random Sample 1 2 3 4 5
All of numbers are posivite
At least one of numbers is even
None of numbers are negative
radar is palindrome
apple is permutation of paple
apple is lexicographically less than paple
mismatch at 6 of first and 7 of second
Current State 1 2 3 4 5 6 7 8 9 10 5
Found 5
Found adjacent 5's in collection
First element of equal_range 5, last element of equal range 6
Lower bound on finding 5 is 5
Upper bound on finding 5 is 6
5 is in the container
max_element 9
min_element 1
min_element 1 max_element 9
std::set<int> s1 {1, 2, 5, 5, 5, 9};
std::set<int> s2 {2, 5, 7};
std::set<int> sdiff;
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(sdiff, sdiff.begin()));
std::cout << "Set difference is ";
for(auto& i : sdiff) std::cout << i << " ";
std::cout << std::endl;
// Note that sorted vector (or any other container) is also considered a set
// More @ https://en.cppreference.com/w/cpp/algorithm/set_difference
std::vector<int> v1 {1, 2, 5, 5, 5, 9};
std::vector<int> v2 {2, 5, 7};
std::vector<int> vdiff;
std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::inserter(vdiff, vdiff.begin()));
std::cout << "Set (vector) difference is ";
for(auto& i : sdiff) std::cout << i << " ";
std::cout << std::endl;
// set_intersection
// More @ https://en.cppreference.com/w/cpp/algorithm/set_intersection
std::set<int> sinter;
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(sinter, sinter.begin()));
std::cout << "Set intersection is ";
for(auto& i : sinter) std::cout << i << " ";
std::cout << std::endl;
// set_union
// More @ https://en.cppreference.com/w/cpp/algorithm/set_union
std::set<int> sunion;
std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(sunion, sunion.begin()));
std::cout << "Set union is ";
for(auto& i : sunion) std::cout << i << " ";
std::cout << std::endl;
// set_symmetric_difference
// More @ https://en.cppreference.com/w/cpp/algorithm/set_symmetric_difference
std::set<int> ssymdiff;
std::set_symmetric_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(ssymdiff, ssymdiff.begin()));
std::cout << "Set symmetric difference is ";
for(auto& i : ssymdiff) std::cout << i << " ";
std::cout << std::endl;
// includes
// More @ https://en.cppreference.com/w/cpp/algorithm/includes
bool includes = std::includes(s1.begin(), s1.end(), s2.begin(), s2.end());
std::cout << "s1 includes s2? " << includes << std::endl;
// merge
// More @ https://en.cppreference.com/w/cpp/algorithm/merge
std::set<int> dst;
std::merge(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(dst, dst.end()));
std::cout << "Content of dst ";
for(auto& i : dst) std::cout << i << " ";
std::cout << std::endl;
Set difference is 1 9
Set (vector) difference is 1 9
Set intersection is 2 5
Set union is 1 2 5 7 9
Set symmetric difference is 1 7 9
s1 includes s2? 0
Content of dst 1 2 5 7 9
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << "Content of numbers ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// copy (a.k.a. deep copy)
// More @ https://en.cppreference.com/w/cpp/algorithm/copy
std::vector<int> cpy;
std::copy(numbers.begin(), numbers.end(), std::back_inserter(cpy));
std::cout << "Content of cpy ";
for(auto& i : cpy) std::cout << i << " ";
std::cout << std::endl;
// move
// More @ https://en.cppreference.com/w/cpp/algorithm/move
std::vector<int> mv;
std::move(numbers.begin(), numbers.end(), std::back_inserter(mv));
std::cout << "Content of mv ";
for(auto& i : mv) std::cout << i << " ";
std::cout << std::endl;
// swap_ranges
// More @ https://en.cppreference.com/w/cpp/algorithm/swap_ranges
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {4, 5, 6};
std::cout << "Content of v1 ";
for(auto& i : v1) std::cout << i << " ";
std::cout << std::endl;
std::cout << "Content of v2 ";
for(auto& i : v2) std::cout << i << " ";
std::cout << std::endl;
std::swap_ranges(v1.begin(), v1.end(), v2.begin());
std::cout << "Content of v1 after swap ";
for(auto& i : v1) std::cout << i << " ";
std::cout << std::endl;
std::cout << "Content of v2 after swap ";
for(auto& i : v2) std::cout << i << " ";
std::cout << std::endl;
// copy_backward
// More @ https://en.cppreference.com/w/cpp/algorithm/copy_backward
std::copy_backward(v1.begin(), v1.begin() + 1, v1.end());
std::cout << "Content of s2 after copy_backward ";
for(auto& i : v1) std::cout << i << " ";
std::cout << std::endl;
// move_backward
// More @ https://en.cppreference.com/w/cpp/algorithm/move_backward
std::move_backward(v2.begin(), v2.begin() + 1, v2.end());
std::cout << "Content of s2 after move_backward ";
for(auto& i : v2) std::cout << i << " ";
std::cout << std::endl;
Content of numbers 1 2 3 4 5 6 7 8 9 10
Content of cpy 1 2 3 4 5 6 7 8 9 10
Content of mv 1 2 3 4 5 6 7 8 9 10
Content of v1 1 2 3
Content of v2 4 5 6
Content of v1 after swap 4 5 6
Content of v2 after swap 1 2 3
Content of s2 after copy_backward 4 5 4
Content of s2 after move_backward 1 2 1
// fill
// More @ https://en.cppreference.com/w/cpp/algorithm/fill
std::vector<int> numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::fill(numbers.begin(), numbers.end(), -1);
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// generate
// More @ https://en.cppreference.com/w/cpp/algorithm/generate
std::generate(numbers.begin(), numbers.end(), [n = 0] () mutable { return n++; });
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// iota
// More @ https://en.cppreference.com/w/cpp/algorithm/iota
std::iota(numbers.begin(), numbers.end(), 42);
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// replace
// More @ https://en.cppreference.com/w/cpp/algorithm/replace
std::replace(numbers.begin(), numbers.end(), 42, 43);
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
Current State 0 1 2 3 4 5 6 7 8 9
Current State -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
Current State 0 1 2 3 4 5 6 7 8 9
Current State 42 43 44 45 46 47 48 49 50 51
Current State 43 43 44 45 46 47 48 49 50 51
// std::remove(begin(collection), end(collection), 99);
// More @ https://en.cppreference.com/w/cpp/algorithm/remove
// collection.erase(std::remove(begin(collection), end(collection), 99), end(collection));
// std::unique(begin(collection)), end(collection));
// More @
// collection.erase(std::remove(begin(collection), end(collection), 99), end(collection));
...
// std::remove_copy: removes 'value' and copies elements to destination
// More @ https://en.cppreference.com/w/cpp/algorithm/remove_copy
std::vector<int> numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
std::vector<int> cpy;
std::remove_copy(numbers.begin(), numbers.end(), std::back_inserter(cpy), 5);
std::cout << "Current State ";
for(auto& i : cpy) std::cout << i << " ";
std::cout << std::endl;
// std::unique_copy
// More @
// std::reverse_copy
// More @
// std::rotate_copy
// More @
// std::replace_copy
// More @
// std::partition_copy
// More @
// std::partial_sort_copy
// More @
Current State 0 1 2 3 4 5 6 7 8 9 10
Current State 0 1 2 3 4 6 7 8 9 10
std::vector<int> numbers = {2, 3, 4, 5, 6, 7, 8, 9, 10};
// std::find_if
// More @
std::vector<int>::iterator it = std::find_if (numbers.begin(), numbers.end(), [](int n){ return n % 7 == 0;});
std::cout << "Found number " << *it << std::endl;
// std::find_if_not
// More @
it = std::find_if_not (numbers.begin(), numbers.end(), [](int n){ return n % 2 == 0;});
std::cout << "Found number " << *it << std::endl;
// std::count_if
// More @
int divisible_by_three = std::count_if(numbers.begin(), numbers.end(), [](int i){return i % 3 == 0;});
std::cout << "Number of entries divisible by three " << divisible_by_three << std::endl;
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// std::remove_if
// More @ https://en.cppreference.com/w/cpp/algorithm/remove
// Important: note that remove_if returns pointer to first elements that satisfy the predicate,
numbers.erase(std::remove_if(numbers.begin(), numbers.end(), [](int n){ return n % 7 == 0;}));
std::cout << "Current State ";
for(auto& i : numbers) std::cout << i << " ";
std::cout << std::endl;
// std::remove_copy_if
// More @
// std::replace_if
// More @
// std::replace_copy_if
// More @
// std::copy_if
// More @
Found number 7
Found number 3
Number of entries divisible by three 3
Current State 2 3 4 5 6 7 8 9 10
Current State 2 3 4 5 6 8 9 10
std::vector<int> numbers = {2, 3, 4, 5, 6, 7, 8, 9, 10};
// std::transform()
// More @
std::vector<int> numbers_two(numbers.size());
std::transform (numbers.begin(), numbers.end(), numbers_two.begin(), [](int i){ return i + 10;});
std::cout << "Current State ";
for(auto& i : numbers_two) std::cout << i << " ";
std::cout << std::endl;
// second overload of std::transform
std::transform (numbers.begin(), numbers.end(), numbers_two.begin(), numbers.begin(), std::plus<int>());
std::cout << "Current State ";
for(auto& i : numbers_two) std::cout << i << " ";
std::cout << std::endl;
// std::for_each(begin(collection), end(collection), f)
Current State 12 13 14 15 16 17 18 19 20
Current State 12 13 14 15 16 17 18 19 20
// std::uninitialized_fill
// More @
// std::uninitialized_copy
// More @
// std::uninitialized_move
// More @
// std::destroy(first, last)
// More @
// #_n
// std::copy_n
// std::fill_n
// std::generate_n
// std::search_n
// std::for_each_n
// std::uninitialized_copy_n
// std::uninitialized_fill_n
// std::uninitialized_move_n
// std::uninitialized_default_construct_n
// std::uninitialized_value_construct_n
// std::destroy_n