如何并行推送到std :: stack?

时间:2017-12-10 21:50:53

标签: c++ stl stack

将列表int []中的推送项并行获取到std :: stack的简单方法是什么?

2 个答案:

答案 0 :(得分: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';
}

请注意,插入函数会将元素从列表移动到堆栈而不是复制它们,这应该非常有效。您可以使用此方案实现基于dequevector的类似功能,以满足您的需求。

答案 1 :(得分:1)

不确定您是否认为这是一个循环,但您可以使用std::for_each和lambda

#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;
}