2013-10-12 6 views
0

나는 푸시, 팝 및 std :: vector의 맨 처음을 얻는 방법을 이해하려고 노력하고 있습니다. 기본적으로 C++의 스택을 벡터로 구현 한 것입니다.std :: vector를 사용하여 스택을 구현하는 방법은 무엇입니까?

구현이 완벽하게 작동하지만 괜찮 으면 큰 도움이 될만한 리소스를 처리하고 있는지 확실하지 않습니다.

std::vector<std::unique_ptr<Estado>> vecEstados; 
// PUSH 
void push(Estado *es){ 
vecEstados.emplace_back(es); // (MENU IS A SUBCLASS OF ESTADO) 
} 
// GET TOP 
Estado *get_top() 
{ 
    return vecEstados.back().get(); 
} 
// POP (THIS SHOULD JUST ERASE LAST ITEM) 
void pop() 
{ 
    vecEstados.erase(vecEstados.end()-1); 
} 
: 그것은 다른 사람을 도움이 될 것입니다, 그래서 나는이 내 현재 코드 등이 발생할 수있는 오류,

그것을 개선하는 방법에 대한 정보를 제공하시기 바랍니다 확인이 아니라면,이 중 많은 예제를 발견하지 않았습니다

+5

이미 ['std :: stack'] (http://en.cppreference.com/w/cpp/container/stack) – P0W

+0

내가 수정해야 할 수도 있습니다 삽입하고 물건을 할 수 있습니다 결국 정상.그 이유는 내가 벡터로 그것을 빌드하도록 선택했습니다 – lisovaccaro

답변

3

PUSH : 올바른 유형의 요소를 전달하면 emplace_back 대신 push_back 대신 emplace_back을 사용하십시오. emplace_back 명시 적으로 생성자로 만듭니다. 이유가있는 경우에만 사용하십시오. std::unique_ptr은 복사 할 수 없으므로 을 std::unique_ptr과 함께 사용해야합니다.

vecEstados.push_back(std::move(es)); 

새 요소를 작성하는 경우는 (C++ 14)를 사용할 수있는 경우, 당신은 std::make_unique를 사용할 수 있습니다. 그러나,이 경우 정말 중요하지 않습니다 :

vecEstados.emplace_back(std::make_unique<Menu>()); 
vecEstados.push_back(std::unique_ptr<Estado>(new Menu{})); 

TOP : 당신이 반환 된 객체를 수정하지 않으려는 경우, 기능 const을합니다. 일관성을 위해 Estado* 대신 std::unique_ptr<Estado>을 반환합니다.

const std::unique_ptr<Estado>& get_top() const 
{ 
    return vecEstados.back(); 
} 

POP : 당신은 std::vector의 마지막 요소를 제거하기 위해 pop_back를 사용해야합니다. 올바른 정리 코드를 작성하기가 쉽기 때문에 noexcept으로 함수를 선언 할 수도 있습니다.

void pop() noexcept 
{ 
    vecEstados.pop_back(); 
} 
+0

그러나 나는 'std :: vector > :: push_back (std :: remove_reference : : type) '|' – lisovaccaro

+0

문제없이 상단 및 팝 솔루션을 모두 구현했는데 푸시의 문제점을 알고 있다면 알려주세요. – lisovaccaro

0

p0W가 언급 했으므로 std :: stack은 이미 있습니다. nosid의 대답에 동의 할 것입니다. 컨테이너가 일반적인하기 위해

template<class Type> 
class LisoStack 
{ 
public: 
    LisoStack() : mStack() {} 

    // Push onto the top of the stack 
    Type push(const Type& val) 
    { 
     mStack.push_back(std::move(val)); 
    } 

    // Get the element at the top 
    Type& top() 
    { 
     return mStack.back(); 
    } 

    // Get the element at the top 
    const Type& top() const 
    { 
     return mStack.back(); 
    } 

    // Remove the element at the top 
    void pop() noexcept 
    { 
     mStack.pop_back(); 
    } 

private: 
    std::vector<Type> mStack; 
}; 
  1. 템플릿 :

    나는 운동이 다소 중복이지만, 표준 : : 스택이 제공하는 인터페이스를 모방 (또는 그것의 일부) 내가 좋아하는 뭔가를 제안 추측 .

  2. get_top()을 top()으로 대체하고 벡터의 뒤쪽 (스택 맨 위)에 요소를 제공하려면 .back()을 수행하십시오. const 및 non-const 버전을 제공하십시오.
  3. pop()은 원하는대로 수행하는 vector.pop_back()을 호출하기 만합니다. 마지막 요소 (스택 맨 위)를 제거합니다.
  4. 언급 한대로, push_back()을 선호합니다 (이 또한 pre C++ 11 컴파일러와의 호환성을 유지함). std :: stack이 제공하는 별도의 emplace() 함수를 구현할 수있는 옵션이 있습니다.
관련 문제