如何用 std 向量初始化 std 堆栈?

How to initialize std stack with std vector?

我需要将 std::vector 放入 std::stack

到目前为止,这是我的方法(我正在制作纸牌游戏):

void CardStack::initializeCardStack(std::vector<Card> & p_cardVector) {
   m_cardStack = std::stack<Card>();
   //code that should initialize m_cardStack with p_cardVector
}

注意:我不能更改我的方法签名,因为它是老师强加的...

我必须遍历整个向量吗?最有效的方法是什么? documentation.

我试过 Jens 的回答,但没用。

最有效的方法是根本不使用 std::stack 而只使用 std::vector 或者更好的方法是使用 std::deque.

我已经看到并编写了很多 C++ 代码(很多),但我还没有找到 stack 东西的任何用途(任何 有意义的 使用,即)。如果可以更改底层容器或在运行时确定其容器类型,情况会有所不同,但事实并非如此。

要将 std::vector 中的元素复制到 std::deque 中,您只需使用

std::deque<T> stack(vec.begin(), vec.end());

这将允许实施使用最有效的方式来复制元素。

明确回答您的问题:是的,将元素放入堆栈的唯一方法是使用循环将它们压入。这效率不高,但堆栈接口没有定义任何其他内容。然而,谁写了接受 std::stack 参数的代码应该被解雇(除非 s/he 承诺它永远不会再发生)并且它的代码恢复到更明智的东西:你会得到相同的(没有)"flexibility" 但更好的界面。

stack 的设计问题是它在底层容器类型上进行了参数化,而相反(要具有任何意义)应该在包含的元素类型 上进行参数化并在构造函数中接收该类型的容器(从而隐藏容器类型)。现在的形式基本没用。

std::stack 没有接受迭代器的构造函数,所以你可以构造一个临时的 deque 并用这个初始化堆栈:

void ClassName::initializeStack(std::vector<AnotherClass> const& v) {
   m_stackAttribute = std::stack<AnotherClass>( std::stack<AnotherClass>::container_type(v.begin(), v.end()) );
}

但是,这会将每个元素复制到容器中。为了最大效率,您还应该使用移动语义来消除副本

void ClassName::initializeStack(std::vector<AnotherClass>&& v) {
   std::stack<AnotherClass>::container_type tmp( std::make_move_iterator(v.begin()), std::make_move_iterator( v.end() ));
   m_stackAttribute = std::stack<AnotherClass>( std::move(tmp) );
}