C++ Vector Array - min_element
오늘의 코트카타 문제입니다.
다음과 같은 문제를 진행할 때 제가 알고 있는 내용으로는
- 내림차순 정렬한 Array를 기준으로 가장 뒤에 값을 찾는다 → 최솟값
- Answer Array에 반복문을 통해서 기존 오리지널 Array에서 최솟값이 아닌 값들만 넣어줍니다.
- Answer Array에 사이즈가 1보다 작으면 -1을 넣어줍니다.
이렇게 로직을 구성해서 해결했습니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
vector<int> answer;
vector<int> originalArr = arr;
stable_sort(arr.begin(), arr.end(), greater<int>()); // 내림차순 정렬
int minElement = arr[arr.size() - 1]; // 최솟값
for (int i = 0; i < originalArr.size(); i++) {
if (originalArr[i] != minElement) { // 최솟값이 아닌 경우만
answer.push_back(originalArr[i]);
}
}
if (answer.size() < 1) {
answer.push_back(-1);
}
return answer;
}
문제는 정상적으로 해결되었지만 다음 사람들이 작성한 풀이를 확인하니 다음과 같은 메서드가 있었습니다.
std::min_element(시작 지점, 끝 지점);
std::min_element()는 C++ 표준 라이브러리 <algorithm> 헤더에 정의되어 있는, 주어진 범위에서 ㄱ장 작은 요소를 찾는 함수입니다.
반복자(Iterator)를 사용해서 범위를 지정하며, 특정 조건에 따라 비교할 수 도 있습니다.
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool abs_compare(int a, int b) {
return abs(a) < abs(b);
}
int main() {
vector<int> intVec = {1, 4, 5, 2, 3};
vector<int> absVec = {-10, -5, 20, 30};
auto min_intVec = *min_element(intVec.begin(), intVec.end());
cout << "min_intVec -> " << min_intVec << endl;
auto min_absVec = *min_element(absVec.begin(), absVec.end(), abs_compare);
cout << "min_absVec -> " << min_absVec << endl;
return 0;
}
Dangling Pointer
같은 위치정보를 가지고 있는 포인터 중에 하나의 포인터에서 메모리 해지를 진행하면 다른 포인터에서는 해지된 메모리라는 정보를 알 수 없어서 잘못된 정보를 가져오는 포인터 → 해지되었는지 모르는 포인터
#include <iostream>
using namespace std;
void func5() {
int* ptr = new int(40);
int* ptr2 = ptr;
cout << "ptr adress = " << ptr << endl;
cout << "ptr2 adress = " << ptr2 << endl;
cout << *ptr << endl;
delete ptr;
cout << *ptr2 << endl; // 이 시점에서 ptr이 해제된 것을 모른다
}
int main() {
func5();
return 0;
}
스마트포인터
#include <iostream>
#include <memory>
using namespace std;
class MyClass {
public:
MyClass(int val) : value(val) {
cout << "MyClass 생성: " << value << endl;
}
~MyClass() {
cout << "MyClass 소멸: " << value << endl;
}
void display() const {
cout << "값: " << value << endl;
}
private:
int value;
};
int main() {
unique_ptr<MyClass> myObject = make_unique<MyClass>(42);
myObject->display();
unique_ptr<MyClass> newOwner = move(myObject);
if (!myObject) {
cout << "myObject는 이제 비어 있습니다." << endl;
}
newOwner->display();
}
템플릿
일반화된 코드를 작성할 수 있는 문법(General Programming)
c#의 제네릭과 비슷한 개념 같다.
#include <iostream>
using namespace std;
template <typename T>
T add(T x, T y) {
return x + y;
}
int main() {
cout << add(3, 4) << endl;
cout << add(3.2, 4.3) << endl;
}
STL(Standard Template Library)
C++에서 자체적으로 제공하는 표준 라이브러리
강의에서는 Vector에 관한 내용을 많이 설명하였는데 → 사실 강의를 보기 전에 따로 사용을 하기 시작해서 내용 정리는 생략합니다.