我需要将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的答案,但它没有用。
答案 0 :(得分:3)
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) );
}
答案 1 :(得分:0)
最有效的方法是根本不使用std::stack
,只使用std::vector
甚至更好地使用std::deque
。
我已经看过并编写过很多C ++代码(很多)但我还没有找到stack
内容的任何用途(任何有意义的使用, 那是)。如果可以更改底层容器或在运行时确定其容器类型,则会有所不同,但事实并非如此。
要将std::vector
中的元素复制到std::deque
,您只需使用
std::deque<T> stack(vec.begin(), vec.end());
这将允许实现使用最有效的方式来复制元素。
明确回答你的问题:是的,将元素放入堆栈的唯一方法是用循环将它们推入。这不是有效的,但堆栈接口不能定义任何其他内容。然而,编写接受std::stack
参数的代码的人应该被解雇(除非他/她承诺它永远不会再发生)并且其代码恢复为更合理的东西:你会得到相同的(缺席)&#34;灵活性&#34;但是更好的界面。
stack
的设计问题是它在底层容器类型上进行了参数化,而在包含的元素类型中应该对其进行参数化(具有任何意义)在构造函数中接收该类型的容器(从而隐藏容器类型)。目前的形式基本没用。