C++의 병렬 배열 데이터 구조
이 기사에서는 C++에서 병렬 배열 데이터 구조를 구현하는 방법을 보여줍니다.
std::vector
컨테이너를 사용하여 C++에서 사용자 지정 병렬 배열 클래스 구현
병렬 배열은 각각 전체 엔터티로 액세스할 수 있는 여러 레코드의 배열을 구현하는 추상 데이터 구조입니다. 기본적으로 해당 요소에 병렬로 액세스할 수 있는 동일한 크기의 여러 배열을 상상해야 합니다. 이 데이터 구조는 배열 중 하나가 정렬되면 발견된 요소와 동일한 인덱스의 해당 요소에 액세스할 수 있으므로 비교적 빠른 요소 검색 작업을 제공할 수 있습니다.
병렬 배열은 다른 방법을 사용하여 구현할 수 있습니다. 이 경우 개념을 더 잘 설명하는 가장 쉬운 방법으로 std::vector
STL 컨테이너를 선택했습니다.
구현을 단순화하기 위해 두 개의 구체적인 유형 배열(string
및 int
)만 저장하도록 ParallelArray
클래스를 정의합니다. 클래스에는 데이터 구조 내용을 저장하는 std::vector
유형의 두 private
데이터 멤버가 포함됩니다. 내부 배열의 예상 크기를 받아들이고 std::vector::reserve
함수를 호출하여 미리 충분한 메모리를 할당하도록 단일 생성자가 정의됩니다. 이 매개변수는 선택사항이며 기본값은 20
입니다.
ParallelArray
유형의 객체를 초기화하면 push_back
멤버 함수를 사용하여 데이터를 해당 객체에 푸시해야 합니다. 이 멤버 함수는 vector
멤버인 v1
과 v2
에 대해 동일한 이름을 가진 해당 멤버 함수를 호출합니다. 또한 ParallelArray
개체의 현재 요소 수를 검색하기 위해 size
라는 멤버 함수를 정의했습니다.
클래스에는 구조에 저장된 요소에 액세스하도록 정의된 []
연산자도 있습니다. operator[]
는 ParallelArray
에 고정 데이터 유형의 배열이 있으므로 std::pair<string, int>
값을 반환합니다. 또는 내부 vector
개체를 초기화하고 이에 따라 멤버 함수를 다시 작성하기 위해 여러 일반 유형을 허용하도록 클래스 템플릿을 구성할 수 있습니다. 클래스가 두 개 이상의 내부 vector
데이터 멤버를 선언하는 경우 operator[]
는 STL의 std::make_tuple
메서드를 사용하여 요소를 반환할 수 있습니다.
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
class ParallelArray {
public:
explicit ParallelArray(size_t size = 20) {
v1.reserve(size);
v2.reserve(size);
};
void push_back(string &d1, int d2);
size_t size();
std::pair<string, int> operator[](size_t pos);
private:
vector<string> v1;
vector<int> v2;
};
void ParallelArray::push_back(string &d1, int d2) {
v1.push_back(d1);
v2.push_back(d2);
}
std::pair<string, int> ParallelArray::operator[](size_t pos) {
if (pos <= v1.size()) {
return std::make_pair(v1[pos], v2[pos]);
} else {
return std::make_pair("null", -1);
}
}
size_t ParallelArray::size() { return v1.size(); }
template <typename T1, typename T2>
void printPair(const std::pair<T1, T2> &pp) {
cout << "{" << pp.first << "," << pp.second << "}" << endl;
}
int main() {
ParallelArray pa1;
vector<string> data_set1 = {"Precise", "Quantal", "Saucy", "Raring"};
vector<int> data_set2 = {11, 22, 33, 44};
for (size_t i = 0; i < data_set1.size(); ++i) {
pa1.push_back(data_set1[i], data_set2[i]);
}
for (size_t i = 0; i < pa1.size(); ++i) {
printPair(pa1[i]);
}
return EXIT_SUCCESS;
}
출력:
{Precise,11}
{Quantal,22}
{Saucy,33}
{Raring,44}
두 코드 조각 모두에서 ParallelArray
개체를 구성한 다음 클래스의 내용을 인쇄하는 main
함수의 일부로 기본 드라이버 코드를 구현합니다. printPair
도우미 기능은 std::pair
개체의 값을 콘솔에 표시하는 데 사용됩니다.
또한 pop_back
멤버 함수를 추가하여 각 vector
데이터 멤버의 끝에서 저장된 요소를 제거할 수 있습니다. pop_back
함수는 매개변수를 허용하지 않고 std::vector::pop_back
함수를 호출합니다. 후자 함수의 사용법은 다음 코드 예제에서 보여줍니다.
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
class ParallelArray {
public:
explicit ParallelArray(size_t size = 20) {
v1.reserve(size);
v2.reserve(size);
};
void push_back(string &d1, int d2);
void pop_back();
size_t size();
std::pair<string, int> operator[](size_t pos);
private:
vector<string> v1;
vector<int> v2;
};
void ParallelArray::push_back(string &d1, int d2) {
v1.push_back(d1);
v2.push_back(d2);
}
std::pair<string, int> ParallelArray::operator[](size_t pos) {
if (pos <= v1.size()) {
return std::make_pair(v1[pos], v2[pos]);
} else {
return std::make_pair("null", -1);
}
}
size_t ParallelArray::size() { return v1.size(); }
void ParallelArray::pop_back() {
v1.pop_back();
v2.pop_back();
}
template <typename T1, typename T2>
void printPair(const std::pair<T1, T2> &pp) {
cout << "{" << pp.first << "," << pp.second << "}" << endl;
}
int main() {
ParallelArray pa1;
vector<string> data_set1 = {"Precise", "Quantal", "Saucy", "Raring"};
vector<int> data_set2 = {11, 22, 33, 44};
for (size_t i = 0; i < data_set1.size(); ++i) {
pa1.push_back(data_set1[i], data_set2[i]);
}
for (size_t i = 0; i < pa1.size(); ++i) {
printPair(pa1[i]);
}
pa1.pop_back();
pa1.pop_back();
cout << "------------------------" << endl;
for (size_t i = 0; i < pa1.size(); ++i) {
printPair(pa1[i]);
}
return EXIT_SUCCESS;
}
출력:
{Precise,11}
{Quantal,22}
{Saucy,33}
{Raring,44}
------------------------
{Precise,11}
{Quantal,22}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook