【问题标题】:How to push to an std::stack in parallel? [closed]如何并行推送到 std::stack? [关闭]
【发布时间】:2017-12-10 21:50:53
【问题描述】:

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

【问题讨论】:

  • “并行”是什么意思?您是想使用多线程,还是只是想一次将所有整数压入堆栈?
  • 有没有办法一次将元素推送到列表中?是的,我想知道如何快速推送几个项目。 (而不是使用 for 循环,我可以做一个并行调用并更快地推送)
  • 如果使用多个线程,您需要使用互斥锁或其他锁来防止多个同时访问。
  • @user1730250:“并行调用”是什么意思?你在谈论线程吗?
  • 我只想知道这是否可以并行完成,或者是否可以一步连续完成(使用 memcpy 或类似的东西)

标签: c++ stl stack


【解决方案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 实现类似的功能,也可以使用此方案,任何适合您的需求。

【讨论】:

    【解决方案2】:

    不确定您是否会认为这是一个循环,但您可以使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2012-05-20
      • 1970-01-01
      • 2019-07-05
      • 2012-01-20
      相关资源
      最近更新 更多