[英]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.