Skip to main content
AI
  • Get started with AI

    • Red Hat AI

      Accelerate the development and deployment of enterprise AI solutions.

    • AI learning hub

      Explore learning materials and tools, organized by task.

    • AI interactive demos

      Click through scenarios with Red Hat AI, including training LLMs and more.

  • Featured resources

    • OpenShift AI learning
    • Open source AI for developers
    • AI product application development
    • Open source-powered AI/ML for hybrid cloud
    • AI and Node.js cheat sheet
  • Red Hat AI Factory with NVIDIA

    • Red Hat AI Factory with NVIDIA is a co-engineered, enterprise-grade AI solution for building, deploying, and managing AI at scale across hybrid cloud environments.
    • Explore the solution
Learn
  • Self-guided

    • Documentation

      Find answers, get step-by-step guidance, and learn how to use Red Hat products.

    • Learning paths

      Explore curated walkthroughs for common development tasks.

    • Guided learning

      Receive custom learning paths powered by our AI assistant.

    • See all learning
  • Hands-on

    • Developer Sandbox

      Spin up Red Hat's products and technologies without setup or configuration.

    • Interactive labs

      Learn by doing in these hands-on, browser-based experiences.

    • Interactive demos

      Click through product features in these guided tours.

  • Browse by topic

    • AI/ML
    • Automation
    • Java
    • Kubernetes
    • Linux
    • See all topics
  • Training & certifications

    • Courses and exams
    • Certifications
    • Skills assessments
    • Red Hat Academy
    • Learning subscription
    • Explore training
Build
  • Get started

    • Red Hat build of Podman Desktop

      A downloadable, local development hub to experiment with our products and builds.

    • Developer Sandbox

      Spin up Red Hat's products and technologies without setup or configuration.

  • Download products

    • Access product downloads to start building and testing right away.
    • Red Hat Enterprise Linux
    • Red Hat AI
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products
  • Featured

    • Red Hat build of OpenJDK
    • Red Hat JBoss Enterprise Application Platform
    • Red Hat OpenShift Dev Spaces
    • Red Hat Developer Toolset
  • References

    • E-books
    • Documentation
    • Cheat sheets
    • Architecture center
Community
  • Get involved

    • Events
    • Live AI events
    • Red Hat Summit
    • Red Hat Accelerators
    • Community discussions
  • Follow along

    • Articles & blogs
    • Developer newsletter
    • Videos
    • Github
  • Get help

    • Customer service
    • Customer support
    • Regional contacts
    • Find a partner
  • Join the Red Hat Developer program

    • Download Red Hat products and project builds, access support documentation, learning content, and more.
    • Explore the benefits
ConsoleDocsSupport Search
New For you

Recommended

We'll recommend resources you may like as you browse. Try these suggestions for now.

  • Product downloads
  • Red Hat Developer learning portal
  • Developer blog
  • Cheat Sheets
  • E-books
  • Developer Sandbox
Log in

Get more with a Red Hat Developer account

  • Product downloads
  • Console access
  • Event registration
  • Training & trials
Explore more account benefitsLog in or register

A subscription may be required for some services.

Contact us

Extend C++ capabilities with LLVM STLExtras.h

October 18, 2019
Jan Kratochvil
Related topics:
Linux

    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

    • Lightbits is now certified for Red Hat OpenStack Services on OpenShift

    • What's new in Red Hat OpenShift 5 for developers

    • On-demand screen context in Red Hat Developer Hub intelligent assistant

    • Make Kubernetes logs easier to correlate with traces using the log normalizer operator

    • What's new in network observability 1.12

    Red Hat Developers logo

    Platforms

    • Red Hat AI
    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    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
    © 2026 Red Hat

    Red Hat legal and privacy links

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