C++Builder 10.4 Sydney supports the ISO C++17 standard in the Clang based compilers for Win32 and Win64. Part of the C++17 standard includes the Algorithms library that provides execution policies to support parallel operations. Below you will find a simple VCL example that uses the C++ std::vector and the algorithms library sort and parallel execution policy to sort random integers in the vector. This example currently compiles using the Clang base compilers for 32 and 64 bit Windows.
Programming Note: While C++Builder doesn’t officially support the parallel extensions. Some code may compile and execute but it may not be actually parallelizing. A good thing to check is the performance vs single threaded execution.
My VCL form contains a TButton, TLabel and two TMemo components.
The Button on-click event handler contains the simple code to create the vector, sort it and display the results.
#include <algorithm>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <algorithm> #include <vector> void __fastcall TForm1::Button1Click(TObject *Sender) { const int max_data = 1000; // number of random numbers to create Memo1->Lines->Clear(); Memo2->Lines->Clear(); Label1->Caption = "Building Random Data"; Label1->Update(); // fill the vector with random numbers and save them in Memo1 std::vector<int> my_data; for (int i = 1; i <= max_data; i++) { int random_value = Random(max_data); my_data.push_back(random_value); Memo1->Lines->Add(IntToStr(random_value)); } Label1->Caption = "Sorting Random Data"; Label1->Update(); // sort the random numbers in the vector std::sort(std::execution::par,my_data.begin(),my_data.end()); // put the sorted vector in Memo2 Label1->Caption = "Sorting Completed"; Label1->Update(); for(int n : my_data) { Memo2->Lines->Add(IntToStr(n)); } } |
If you want to include code for non-Clang and Clang compilers, you can use the following #if, #elif, #else, #endif preprocessor directives in your applications.
1 2 3 4 5 6 7 8 9 10 11 |
#if defined(__clang__) #if (__clang_major__ == 5 && __clang_minor__ == 0) #warning "clang major = 5 and clang minor = 0" #elif (__clang_major__ == 3 && __clang_minor__ == 3) #warning "clang major = 3 and clang minor = 3" #else #warning "Unable to determine correct clang header version" #endif #else #warning "not a clang compiler" #endif |
C++ 17 References used in this simple example:
std::vector
C++ Containers library std::vector
Defined in header <vector>
https://en.cppreference.com/w/cpp/container/vector
Algorithms library
The algorithms library adds functionality beyond the standard C++ library. This library defines additional functions for searching, sampling, sorting, counting, manipulating, generalized summing and more.
Defined in header <algorithm>
https://en.cppreference.com/w/cpp/algorithm
Sort algorithm
https://en.cppreference.com/w/cpp/algorithm/sort
Algorithm execution policies
https://en.cppreference.com/w/cpp/algorithm/execution_policy_tag
Algorithm execution policy types
https://en.cppreference.com/w/cpp/algorithm/execution_policy_tag_t
Know more about STL’s std::find C++ method to get a hint on how to supercharge your productivity while you write code.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition
Is it possible to get the full code example for c++ builder it seems it’s incomplete
Hi Sander – yes I think it lost something in the translation to this web page. Sorry about that.
Here’s David I’s original blog post which has a more complete listing of the code on it: https://davidiontools.com/2020/08/18/multithreaded-sorting-cbuilder-ppl/