# KDAlgorithms **Repository Path**: mirrors_KDAB/KDAlgorithms ## Basic Information - **Project Name**: KDAlgorithms - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-03 - **Last Updated**: 2025-12-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Algorithm helpers - kdalgorithms ================================ The purpose of this library is to make it easier to work with algorithms in C++14 and up. * Documentation of all the algorithms * Deploying the algorithms with CMake * Get inspired by some real world examples * Get inspired by all the unit tests * Youtube video introducing the library * A blog post on KDAlgorithms * Change Log Example - filtered ------------------ With C++11 algorithms you might write: ``` std::vector result; auto is_odd = [] (int i) {return i % 2 == 1; }; std::copy_if(my_list.cbegin(), my_list.cend(), std::back_inserter(result), is_odd); ``` With this library you can instead write: ``` auto is_odd = [] (int i) {return i % 2 == 1; }; auto result = kdalgorithms::filtered(my_list, is_odd); ``` Observe that it: 1. takes a complete collection rather than an iterator pairs 2. returns the result rather than taking an iterator to where it should go Example - max_value_less_than ----------------------------- When searching in a collection for the largest element no larger than a given value, a good algorithmic choice is std::upper_bound, or ... is it std::lower_bound, and what exactly does is return? Here is how to do it with this library: ``` std::optional result = kdalgorithms::max_value_less_than(int_vector, 4); ``` By returning an optional rather than an iterator, you do not need to worry whether you should check it against int_vector.begin() or int_vector.cbegin(). It is also more obvious that the value might be non-existent - after all, that is what std::optional is all about. Combining Algorithms -------------------- kdalgorithms offers and, or and not operators, which makes it possible to write code like this: ``` using namespace kdalgorithms::Operators; std::vector vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const auto is_odd = [](int num) { return num % 2 == 1; }; const auto is_greather_than = [](int num) { return [num](int value) { return value > num; }; }; const auto is_dividable_by = [](int num) { return [num](int value) { return value % num == 0; }; }; auto result = kdalgorithms::filtered(vec, is_odd || (is_greather_than(5) && !is_dividable_by(3))); ``` Using member functions as predicates ------------------------------------ Throughout the documentation we will used lambda expressions for predicates and comparison methods given to algorithms. It is, however, also possible to use pointer to member functions: ``` struct S { int x; int y; bool hasEqualKeyValuePair() const { return x == y; } }; std::vector vec{{2, 3}, {1, 1}, {2, 2}, {4, 1}}; kdalgorithms::erase_if(vec, &Struct::hasEqualKeyValuePair); ``` Be aware though that the method must be const. Lots of Examples ---------------- In this document you will find lots of examples. More, however, may be found in the unit tests. Qt -- kdalgorithms supports all of Qt's containers, with the exception that with Qt5 QSet isn't supported.