繁体   English   中英

如何使用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
}

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

我是否必须迭代整个向量? 最有效的方法是什么? 文档

我试过Jens答案,但它没有用。

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) );
}

最有效的方法是根本不使用std::stack ,只使用std::vector ,甚至更好地使用std::deque

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM