C++Builder C++17 알고리즘 라이브러리 병렬 정렬 사용하기
2020.08.13 13:58
데이비드 아이가 작성한 글을 번역한 글입니다.
C++빌더 10.4 시드니는 ISO C++17 표준을 지원합니다. Win32와 Win64용 Clang 기반 컴파일러에서 사용할 수 있습니다. C++17 표준은 알고리즘 라이브러리를 제공합니다. 이를 통해 실행 정책(Execution Policies)을 활용해 병렬성을 활용할 수 있게 되었습니다. 아래 간단한 VCL 예제를 참고해보세요. C++ std::vector와 알고리즘 라이브러리 정렬, 병렬성 실행 정책을 활용해 벡터에서 임의로 작성된 정수들을 정렬하는 예제입니다.
VCL 폼에 TButton, TLabel, 두개의 TMemo 컴포넌트를 올려놓습니다.
버튼의 on-click 이벤트 핸들러에 간단한 코드를 작성해보겠습니다.
이 코드는 벡터 생성, 정렬, 결과값을 보여주기 위한 것입니다.
#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));
}
}
|
non-Clnag과 Clang 컴파일러용 코드를 활용하고 싶다면 #if, #eif, #else, #endif 전처리 지시문을 사용하면 됩니다.
#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 관련 간단한 예제들
std::vector
C++ 컨테이너 라이브러리 std::vector
알고리즘 라이브러리
정렬 알고리즘
알고리즘 실행 정책(Execution Policies)
알고리즘 실행 정책 타입들