[Basic C++] #51_STL 이동 알고리즘, move
STL 알고리즘 중 "이동 알고리즘"에 대해 알아보겠습니다.
"전문가를 위한 C"의 17 항목, "STL 알고리즘 마스터하기"에 해당하는 내용입니다.
move()
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class MyClass {
public:
// 1. vecDest에 vecSrc만큼의 공간을 할당하기위해 기본 생성자가 필요합니다.
MyClass() = default;
// 2. MyClass의 복제 생성자를 컴파일러가 제공하는 디폴트 복제 생성자를 사용합니다.
MyClass(const MyClass& src) = default;
MyClass(string str) :myStr(str) {};
// 3. 사용자 정의 이동 대입 연산자, "noexecpt"에 주목!
MyClass& operator = (MyClass&& rhs) noexcept
{
// 본인일 경우 그대로 자기 자신을 반환합니다.
if (this == &rhs)
return *this;
// std::move()를 통해 우측값으로 변경
myStr = std::move(rhs.myStr);
return *this;
}
void Print() const { cout << "This is class " << myStr << endl; }
private:
string myStr;
};
int main()
{
vector<MyClass> vecSrc{ MyClass("a"), MyClass("b"), MyClass("c") };
vector<MyClass> vecDest(vecSrc.size());
move(begin(vecSrc), end(vecSrc), begin(vecDest));
for (auto& c : vecDest)
c.Print();
}
* 결과 화면
* 우측 값 참조, 혹은 이동 시맨틱 관련 내용은 위 링크를 참조해주세요!
"move" 알고리즘은 이전에 설명했던 "이동 시맨틱"을 구현합니다.
간단하게, "move" 알고리즘은 이동 시맨틱을 구현하여, 컨테이너와 컨테이너 간의 항목들의 이동을 수행합니다.
먼저, "대상 컨테이너"에 충분한 공간을 확보하기 위해 항목 클래스에서 "기본 생성자"를 구현하고 있어야 하며,
사용자 정의 이동 대입 연산자 구현이 필수적입니다.
이때, 이동 대입 연산자의 구현에 "noexecpt" 키워드를 통해 예외를 방출하지 않을 것임을 명시해야 합니다!
여기서 기본 복제 생성자 사용 명시를 굳이 작성하지 않아도 정상적으로 코드가 컴파일되지만, 혹시 모를 복제 연산을 위해 작성해두었다고 생각합시다!
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #53_STL 알고리즘, remove + erase, 옮기고 삭제하기 (0) | 2022.07.19 |
---|---|
[Basic C++] #52_STL 알고리즘, replace (0) | 2022.07.19 |
[Basic C++] #50-1_STL 알고리즘, 변경 순차 알고리즘, transform(), copy(), copy_if(), copy_n() (0) | 2022.07.15 |
[Basic C++] #49_STL 알고리즘, 불변 순차 알고리즘 (0) | 2022.07.13 |
[Basic C++] #48_함수 객체 어댑터, 바인더, not1(), not2(), mem_fn() (0) | 2022.07.09 |