Skip to content

C++ STL Algorithms

Overview

The STL provides a rich collection of algorithms that operate on containers through iterators.

Non-modifying Algorithms

std::find and std::find_if

cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {10, 20, 30, 40, 50};
    
    // Find specific value
    auto it = std::find(vec.begin(), vec.end(), 30);
    if (it != vec.end()) {
        std::cout << "Found 30 at position: " << std::distance(vec.begin(), it) << std::endl;
    }
    
    // Find using condition
    auto it2 = std::find_if(vec.begin(), vec.end(), [](int x) {
        return x > 25;
    });
    if (it2 != vec.end()) {
        std::cout << "First element > 25: " << *it2 << std::endl;
    }
    
    return 0;
}

std::count and std::count_if

cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {10, 20, 30, 20, 40, 20, 50};
    
    // Count specific value
    int count = std::count(vec.begin(), vec.end(), 20);
    std::cout << "Count of 20: " << count << std::endl;
    
    // Count using condition
    int even_count = std::count_if(vec.begin(), vec.end(), [](int x) {
        return x % 2 == 0;
    });
    std::cout << "Count of even numbers: " << even_count << std::endl;
    
    return 0;
}

std::for_each

cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    
    // Apply function to each element
    std::for_each(vec.begin(), vec.end(), [](int x) {
        std::cout << x << " ";
    });
    std::cout << std::endl;
    
    // Modify elements using for_each
    std::for_each(vec.begin(), vec.end(), [](int& x) {
        x *= 2;
    });
    
    std::cout << "After doubling: ";
    for (int x : vec) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Modifying Algorithms

std::transform

cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result(vec.size());
    
    // Transform elements
    std::transform(vec.begin(), vec.end(), result.begin(), [](int x) {
        return x * x;
    });
    
    std::cout << "Original: ";
    for (int x : vec) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    std::cout << "Squared: ";
    for (int x : result) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

std::copy and std::move

cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> source = {10, 20, 30, 40, 50};
    std::vector<int> destination(5);
    
    // Copy elements
    std::copy(source.begin(), source.end(), destination.begin());
    
    std::cout << "Copied: ";
    for (int x : destination) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    // Copy with back_inserter
    std::vector<int> dest2;
    std::copy(source.begin(), source.end(), std::back_inserter(dest2));
    
    return 0;
}

std::fill and std::replace

cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec(10);
    
    // Fill with value
    std::fill(vec.begin(), vec.end(), 0);
    
    std::cout << "After fill: ";
    for (int x : vec) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    // Replace values
    vec[2] = 5;
    vec[5] = 5;
    vec[8] = 5;
    
    std::replace(vec.begin(), vec.end(), 5, 99);
    
    std::cout << "After replace: ";
    for (int x : vec) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

Sorting Algorithms

std::sort

cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 9, 3};
    
    // Sort in ascending order
    std::sort(numbers.begin(), numbers.end());
    
    std::cout << "Sorted ascending: ";
    for (int x : numbers) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    // Sort in descending order
    std::sort(numbers.begin(), numbers.end(), std::greater<int>());
    
    std::cout << "Sorted descending: ";
    for (int x : numbers) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    
    // Sort strings
    std::vector<std::string> words = {"banana", "apple", "cherry", "date"};
    std::sort(words.begin(), words.end());
    
    std::cout << "Sorted words: ";
    for (const auto& word : words) {
        std::cout << word << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

std::stable_sort

cpp
#include <iostream>
#include <vector>
#include <algorithm>

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector<Person> people = {
        {"Alice", 25},
        {"Bob", 20},
        {"Charlie", 25},
        {"David", 30}
    };
    
    // Stable sort by age (maintains order of equal elements)
    std::stable_sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
        return a.age < b.age;
    });
    
    std::cout << "Sorted by age (stable):" << std::endl;
    for (const auto& person : people) {
        std::cout << person.name << ": " << person.age << std::endl;
    }
    
    return 0;
}

Numeric Algorithms

std::accumulate

cpp
#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    
    // Sum all elements
    int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
    std::cout << "Sum: " << sum << std::endl;
    
    // Product of all elements
    int product = std::accumulate(numbers.begin(), numbers.end(), 1, std::multiplies<int>());
    std::cout << "Product: " << product << std::endl;
    
    // Custom operation
    std::string result = std::accumulate(numbers.begin(), numbers.end(), std::string(),
        [](const std::string& acc, int x) {
            return acc + std::to_string(x) + "+";
        });
    std::cout << "Concatenated: " << result << std::endl;
    
    return 0;
}

std::min_element and std::max_element

cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {10, 5, 20, 15, 8, 25};
    
    auto min_it = std::min_element(numbers.begin(), numbers.end());
    auto max_it = std::max_element(numbers.begin(), numbers.end());
    
    std::cout << "Minimum: " << *min_it << std::endl;
    std::cout << "Maximum: " << *max_it << std::endl;
    
    return 0;
}

Content is for learning and research only.