如何初始化std堆栈与std向量

How to initialize std stack with std vector?

本文关键字:std 向量 堆栈 初始化      更新时间:2023-10-16

我需要将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()) );
}

但是,这会将每个元素复制到容器中。为了获得最大的效率,您还应该使用move-semantics来消除拷贝

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的设计问题是,它是在底层容器类型上参数化的,而(为了有任何意义)应该在包含的元素类型上参数化,并在构造函数中接收该类型的容器(从而隐藏容器类型)。