어제 배웠던 STL과 알고리즘에 대해 자세히 알아보자
Vector
벡터는 동적배열로, 사용자가 원하는 만큼 크기를 조절합니다. 인덱스를 통해 빠른 접근이 가능합니다.
단점: 연속된 메모리 구조로 인해 중간요소를 삽입하거나 삭제할때 시간이 걸립니다.
ex)
std::vector<int> numbers;
numbers.push_back(5);
numbers.push_back(10);
numbers.push_back(15);
for (size_t i = 0; i < numbers.size(); i++) {
std::cout << numbers[i] << " ";
} // 출력: 5 ,10,15
numbers.pop_back();//출력 : 5, 10
list
리스트는 이중연결리스트(연결된 기차라고 생각하면 편함 )로 ,중간 삽입과 삭제가 빠릅니다. 연속된 메모리가 없기에 메모리 할당도 자유롭습니다.
단점: 인덱스로 접근 할수 없습니다.
std::list<int> numbers;
numbers.push_back(5);
numbers.push_front(10);
numbers.insert(++numbers.begin(), 20); // 두 번째 위치에 삽입
for (int num : numbers) {
std::cout << num << " ";
}
set
셋은 중복되지않게 요소를 저장하며 자동으로 정렬됩니다.
검색,삽입,삭제가 **O(log n)**의 시간 복잡도로 수행되며, 인덱스로 접근은 불가능합니다.
ex)
std::set<int> numbers = {5, 10, 15};
numbers.insert(5); // 중복된 값은 무시됨
for (int num : numbers) {
std::cout << num << " ";
}
numbers.erase(10);
Map
맵은 키 - 값으로 짝을 이뤄서 데이터를 저장합니다. 키는 유일해야하며 자동으로 정렬됩니다.(오름차순)
검색,삽입,삭제가 O(log n)의 시간 복잡도로 수행됩니다.
ex)
std::map<std::string, int> ages;
ages["Alice"] = 30;
ages.insert({"Bob", 25});
if (ages.find("Bob") != ages.end()) {
std::cout << "Bob의 나이: " << ages["Bob"] << std::endl;
}
ages.erase("Alice");
알고리즘
프로그래밍을 공부해본 경험이 있다면 다양한 알고리즘이 있다는 것을 알게 될겁니다.
그 중 가장 대표적인 Sort(정렬),Find(검색), Transform(변환), Accumulate(합계)을 지원합니다.
Sort
주어진 범위의 데이터를 오름차순 또는 내림차순으로 정렬합니다. 정렬조건을 추가할 수 있습니다.
std::vector<int> numbers = {5, 3, 8, 1, 2};
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
for (int num : numbers) {
std::cout << num << " "; // 8 5 3 2 1
}
Find
std::find는 주어진 범위에서 특정 값을 찾는 선형 검색 알고리즘입니다. 요소가 많을 경우 **이진 탐색(binary search)**이 더 효율적입니다.
STL에서는 다양한 이진탐색 관련 함수를 제공합니다.(ex. std::binary_search,std::lower_bound,std::upper_bound 등)
ex)
std::vector<int> numbers = {1, 2, 3, 4, 5};
auto it = std::find(numbers.begin(), numbers.end(), 3);
if (it != numbers.end()) {
std::cout << "값 3을 찾았습니다.";
}
Transform
각 요소에 변환(ex. 산술연산)을 적용하여 새로운 범위(새로운 벡터나 리스트나 새로운 박스)에 저장합니다.
ex)
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::vector<int> squares(numbers.size());
std::transform(numbers.begin(), numbers.end(), squares.begin(), [](int x) {
return x * x;
});
for (int square : squares) {
std::cout << square << " "; // 1 4 9 16 25
}
Accumulate
합계는 주어진 범위(박스)의 요소를 누적(합하거나 곱 등등)하여 하나의 결과를 생성합니다.
ex)
std::vector<int> numbers = {1, 2, 3, 4, 5};
int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
std::cout << "합계: " << sum << std::endl; // 15
int product = std::accumulate(numbers.begin(), numbers.end(), 1, std::multiplies<int>());
std::cout << "곱: " << product << std::endl; // 120
'언리얼(Unreal) > 엔진' 카테고리의 다른 글
24.12.11 언리얼 언리얼엔진의 기초 (0) | 2024.12.11 |
---|---|
24.12.10 언리얼(람다함수 사용법) (0) | 2024.12.10 |
24.12.08 언리얼( STL의 기본 개념과 사용법) (0) | 2024.12.08 |
24.12.07 언리얼(스마트 포인터에 대하여) (0) | 2024.12.07 |
24.12.06 언리얼 (템플릿에 대하여) (1) | 2024.12.06 |