簡體   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