2017-12-10 12 views
-2

リストint []内のアイテムをstd :: stackに並列で取得する簡単な方法は何ですか?std :: stackを並列にプッシュする方法は?

+0

を使用することができますか?マルチスレッドを使用したいのですか?または、すべての整数を一度にスタックにプッシュしたいだけですか? –

+0

リストに要素を一度にプッシュする方法はありますか?ええ、私はいくつかのアイテムをすばやく押す方法を知りたいです。 (forループを使用する代わりに、私はparrallel呼び出しを行い、より速くプッシュすることができます) – user1730250

+2

複数のスレッドを使用する場合は、複数の同時アクセスを防ぐためにmutexまたは他のロックを使用する必要があります。 – SoronelHaetir

答えて

1

あなたがスタック上にリストから「マルチプッシュ」要素にしたい場合は、基本的には、スタックがちょうどコンテナアダプタであるという事実を使用することができます。

#include <iostream> 
#include <list> 
#include <stack> 

template <typename T> 
class My_stack final : std::stack<T, std::list<T>> { 
public: 
    using std::stack<T, std::list<T>>::stack; 
    using std::stack<T, std::list<T>>::push; 
    using std::stack<T, std::list<T>>::pop; 
    using std::stack<T, std::list<T>>::top; 
    using std::stack<T, std::list<T>>::empty; 
    using std::stack<T, std::list<T>>::swap; 
    using std::stack<T, std::list<T>>::size; 
    using std::stack<T, std::list<T>>::emplace; 
    using std::stack<T, std::list<T>>::operator =; 

    void push_elements(std::list<T>& l, 
         typename std::list<T>::const_iterator begin, 
         typename std::list<T>::const_iterator end) 
    { 
     this->c.splice(std::end(this->c), l, begin, end); 
    } 
}; 

int main() 
{ 
    std::list l{ 1, 2, 3, 4, 5 }; 
    My_stack<int> st{ l }; 
    st.push_elements(l, std::begin(l), std::next(begin(l), 3)); 
    std::cout << st.top() << ' ' << st.size() << '\n'; 
} 

注挿入機能が移動しています要素をリストからスタックにコピーするのではなく、非常に効率的でなければなりません。 dequeまたはvectorに基づく類似の関数を、このスキームを使用して、必要に応じて実装することができます。

1

わからないあなたはこのループ考えるだろうが、あなたは「並行して」とはどういう意味ですかあなたはstd::for_eachとラムダ

#include <algorithm> 
#include <stack> 

int main() 
{ 
    std::stack<int> s; 
    int list[5] = { 1,2,3,4,5 }; 

    std::for_each(std::begin(list), std::end(list), [&s](int i) { s.push(i); }); 

    return 0; 
} 
関連する問題