: stl 컨테이너에서 널리 사용되어 지고 잇다.
vector ints;
vectordbs;
vectorcat;
-> 자료형에 따라 컨테이너가 구성되는 것을 알고 있다.
-> 주의 깊게 봐야 할 곳은 push에서 move하는 부분이다.
main 부에서 매개인자로 들어오는 값들은 Rvalue이기 때문에
push의 elem 매개변수는 복사 대입을 하지 않는다.
컴파일러가 이미 1,2,3값이 사라지는 것을 알기 때문에 복사대입이 아니면
copy elision 동작을 하기 때문이다.
그리고 push의 매개변수를 레퍼런스 타입으로는 받을 수 없다.
왜냐하면 상수는 주소값이 없기 때문에
실제 stack의 push 함수의 매개변수를 보면 오버로딩이 2개가 있다.
1) rValue
2) lValue를 구분햇으므로
구현부
호출부
-> Rvalue와 LValue 모두 push 가능하도록 만들엇따.
template <typename T>
class Stack
{
private :
vector<T>mVec;
public :
void push(T&& elem)
{
mVec.emplace_back(move(elem));
}
void push(const T& elem)
{
mVec.emplace_back(move(elem));
}
bool pop(T& elem)
{
if (mVec.size() == 0)
return false;
elem = mVec[mVec.size() - 1];
mVec.pop_back();
return true;
}
};
int main()
{
Stack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
int g = 4;
stack.push(g);
int n;
while (stack.pop(n))
{
cout << n << endl;
}
return 0;
}