Skip to main content
Redhat Developers  Logo
  • Products

    Featured

    • Red Hat Enterprise Linux
      Red Hat Enterprise Linux Icon
    • Red Hat OpenShift AI
      Red Hat OpenShift AI
    • Red Hat Enterprise Linux AI
      Linux icon inside of a brain
    • Image mode for Red Hat Enterprise Linux
      RHEL image mode
    • Red Hat OpenShift
      Openshift icon
    • Red Hat Ansible Automation Platform
      Ansible icon
    • Red Hat Developer Hub
      Developer Hub
    • View All Red Hat Products
    • Linux

      • Red Hat Enterprise Linux
      • Image mode for Red Hat Enterprise Linux
      • Red Hat Universal Base Images (UBI)
    • Java runtimes & frameworks

      • JBoss Enterprise Application Platform
      • Red Hat build of OpenJDK
    • Kubernetes

      • Red Hat OpenShift
      • Microsoft Azure Red Hat OpenShift
      • Red Hat OpenShift Virtualization
      • Red Hat OpenShift Lightspeed
    • Integration & App Connectivity

      • Red Hat Build of Apache Camel
      • Red Hat Service Interconnect
      • Red Hat Connectivity Link
    • AI/ML

      • Red Hat OpenShift AI
      • Red Hat Enterprise Linux AI
    • Automation

      • Red Hat Ansible Automation Platform
      • Red Hat Ansible Lightspeed
    • Developer tools

      • Red Hat Trusted Software Supply Chain
      • Podman Desktop
      • Red Hat OpenShift Dev Spaces
    • Developer Sandbox

      Developer Sandbox
      Try Red Hat products and technologies without setup or configuration fees for 30 days with this shared Openshift and Kubernetes cluster.
    • Try at no cost
  • Technologies

    Featured

    • AI/ML
      AI/ML Icon
    • Linux
      Linux Icon
    • Kubernetes
      Cloud icon
    • Automation
      Automation Icon showing arrows moving in a circle around a gear
    • View All Technologies
    • Programming Languages & Frameworks

      • Java
      • Python
      • JavaScript
    • System Design & Architecture

      • Red Hat architecture and design patterns
      • Microservices
      • Event-Driven Architecture
      • Databases
    • Developer Productivity

      • Developer productivity
      • Developer Tools
      • GitOps
    • Secure Development & Architectures

      • Security
      • Secure coding
    • Platform Engineering

      • DevOps
      • DevSecOps
      • Ansible automation for applications and services
    • Automated Data Processing

      • AI/ML
      • Data Science
      • Apache Kafka on Kubernetes
      • View All Technologies
    • Start exploring in the Developer Sandbox for free

      sandbox graphic
      Try Red Hat's products and technologies without setup or configuration.
    • Try at no cost
  • Learn

    Featured

    • Kubernetes & Cloud Native
      Openshift icon
    • Linux
      Rhel icon
    • Automation
      Ansible cloud icon
    • Java
      Java icon
    • AI/ML
      AI/ML Icon
    • View All Learning Resources

    E-Books

    • GitOps Cookbook
    • Podman in Action
    • Kubernetes Operators
    • The Path to GitOps
    • View All E-books

    Cheat Sheets

    • Linux Commands
    • Bash Commands
    • Git
    • systemd Commands
    • View All Cheat Sheets

    Documentation

    • API Catalog
    • Product Documentation
    • Legacy Documentation
    • Red Hat Learning

      Learning image
      Boost your technical skills to expert-level with the help of interactive lessons offered by various Red Hat Learning programs.
    • Explore Red Hat Learning
  • Developer Sandbox

    Developer Sandbox

    • Access Red Hat’s products and technologies without setup or configuration, and start developing quicker than ever before with our new, no-cost sandbox environments.
    • Explore Developer Sandbox

    Featured Developer Sandbox activities

    • Get started with your Developer Sandbox
    • OpenShift virtualization and application modernization using the Developer Sandbox
    • Explore all Developer Sandbox activities

    Ready to start developing apps?

    • Try at no cost
  • Blog
  • Events
  • Videos

Extend C++ capabilities with LLVM STLExtras.h

October 18, 2019
Jan Kratochvil
Related topics:
Linux

Share:

    The LLVM compiler project provides a header file called STLExtras.h that extends the capabilities of C++ without any dependency on the rest of LLVM. In this article, we take a quick look at its basic functionality.

    LLVM STLExtras.h

    For the /usr/include/llvm/ADT/STLExtras.h file, you need to install:

    • Fedora: dnf install llvm-devel
    • RHEL-8: yum install llvm-devel
    • RHEL-7/8 with LLVM toolset 7.0: yum install llvm-toolset-7.0-{clang,llvm-devel};scl enable llvm-toolset-7.0 -- clang++ -I$(scl enable llvm-toolset-7.0 -- llvm-config --includedir) -std=c++17 ...

    llvm::reverse

    = reverse range-based for loop

    C++11 brought range-based for loops. We no longer have to deal with iterators in the most common cases.

    See also online compiler sample code.

      std::vector vec{1, 2, 3, 4}; // C++11 initializer list
    
      // C++98 iterator: 1 2 3 4
      for (std::vector::iterator it = vec.begin(); it != vec.end(); ++it)
        std::cout << *it;
    
      // C++11 range-based for loop: 1 2 3 4
      for (int i : vec)
        std::cout << i;
    

    Except... when we need to iterate in the opposite way. C++11 somehow forgot about that. Here comes LLVM with its llvm::reverse container adapter.

    See also online compiler sample code.

      std::vector vec{1, 2, 3, 4};
    
      // Reverse range-based for loop - llvm::reverse: 4 3 2 1
      for (int i : llvm::reverse(vec))
        std::cout << i;
    }
    

    Range-based algorithms

    = vec.begin(),vec.end() → vec

    It's a bit annoying to always write both begin() and end() for container algorithms, right?

      std::vector vec{1, 2, 3, 4};
      std::sort(vec.begin(),vec.end());
      // or:
      std::sort(vec.begin(),vec.end(), std::greater());
    

    The problem is solved already; it really is that simple:

    #define LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING 1 // no LLVM libraries needed
    #include <llvm/ADT/STLExtras.h>
      std::vector vec{1, 2, 3, 4};
      llvm::sort(vec);
      // or:
      llvm::sort(vec, std::greater());
    

    It applies to all the C++ algorithms: ­std::sort ­std::for_each ­std::all_of ­std::any_of ­std::none_of ­std::find ­std::find_if ­std::find_if_not ­std::remove_if ­std::copy_if ­std::copy ­std::count ­std::count_if ­std::transform ­std::partition ­std::lower_bound ­std::upper_bound

    It is expected as std::ranges:: in C++20.

    Additionally, it provides:

    • is_contained = std::find with a bool result
    • is_splat = return a bool whether all elements in a container are the same
    • erase_if = std::remove_if with more convient calling (expected in C++20)

    See also online compiler sample code.

    Last updated: July 1, 2020

    Recent Posts

    • Alternatives to creating bootc images from scratch

    • How to update OpenStack Services on OpenShift

    • How to integrate vLLM inference into your macOS and iOS apps

    • How Insights events enhance system life cycle management

    • Meet the Red Hat Node.js team at PowerUP 2025

    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Products

    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform

    Build

    • Developer Sandbox
    • Developer Tools
    • Interactive Tutorials
    • API Catalog

    Quicklinks

    • Learning Resources
    • E-books
    • Cheat Sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site Status Dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Report a website issue