2017-12-10 3 views
-2

int [] 목록에서 push 항목을 std :: stack에 병렬로 얻는 간단한 방법은 무엇입니까? 당신은 스택에 목록에서 "멀티 푸시"요소, 당신은 기본적으로 스택은 단지 컨테이너 어댑터는 사실 사용하려면병렬로 std :: stack을 푸시하는 방법은 무엇입니까?

+0

를 사용할 수 있는지? 멀티 스레딩을 사용 하시겠습니까? 아니면 단순히 모든 정수를 스택에 밀어 넣기를 원하십니까? –

+0

한 번에 목록에서 요소를 푸시 할 수있는 방법이 있습니까? 네, 여러 항목을 빨리 푸는 방법을 알고 싶습니다. (for 루프를 사용하는 대신 parrallel 호출을 수행하고 더 빨리 푸시 할 수 있음) – user1730250

+2

다중 스레드를 사용하는 경우 다중 동시 액세스를 방지하기 위해 뮤텍스 또는 다른 잠금을 사용해야합니다. – 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; 
} 
관련 문제