【问题标题】:what is stl-style for merge two containers while alternating the elements?在交替元素的同时合并两个容器的 stl 样式是什么?
【发布时间】:2013-04-21 03:09:49
【问题描述】:

用 STL 风格而不是 for(;;) 执行以下操作的优雅方法是什么:

鉴于 p={1,2,3} 和 q={7,8,9},我想将其合并为 pq={1,7,2,8,3,9}。一个应用程序正在创建 pq 向量,用于积分偏离位置 (q) 和动量 (p):

for(size_t i=0; i<p.size();++i) {
 pq.push_back(p[i]);
 pq.push_back(q[i]);
}

它不优雅,它不是 stl。它有效,但这个问题是关于正确学习 stl 风格而不是完成工作,因此它与 https://stackoverflow.com/questions/10746197/how-to-fit-elements-of-two-vectors-alternately-in-c 不同(请在关闭它之前发表评论,以便我重新措辞)

我正在寻找的解决方案应该使用一些 stl 算法和迭代器操作。 boost也不错。

【问题讨论】:

  • 我知道stackoverflow.com/questions/3660058/… 但它有所不同,因为这里的模式定义明确。这种情况在物理学中很常见,因此量身定制的解决方案会很好
  • “它有效......”它真的有效吗?当 i 小于 6 但大于 2 时,您的代码将出现段错误...我猜 i &lt; p.size() 就是您的意思。
  • @maditya 谢谢,我纠正了错字

标签: optimization boost coding-style iterator stl-algorithm


【解决方案1】:

我不知道真正适合这项任务的现有算法。显而易见的替代方法是大致编写上面的代码,但作为通用算法:

template <class InIter1, class InIter2, class OutIter>
OutIter unsorted_merge(InIter1 b1, Inter1 e1, inIter2 b2, OutIter r) { 
    while (b1 != e1) {
        *r = *b1; ++r; ++b1;
        *r = *b2; ++r; ++b2;
    }
    return r;
};

尽管那个代码可能不是特别优雅或漂亮,但其余代码可以:

unsorted_merge(p.begin(), p.end(), q.begin(), std::back_inserter(pq));

【讨论】:

    【解决方案2】:

    没有交叉两个数据结构的 STL 算法,如果这就是您所要求的。然而,如果你想要一个基于迭代器的解决方案,你可以这样做:

    auto pIt = p.begin(), qIt = q.begin();
    bool even = false;
    while(pIt != p.end() && qIt != q.end()) {
      auto nextElement = (even = !even) ? pIt : qIt;
      pq.push_back(*nextElement);
      ++pIt;
      ++qIt;
    }
    

    这样做的好处是交错每个向量的前 n 个元素,其中 n 是较小向量的大小。

    【讨论】:

      【解决方案3】:

      使用 lambda 和 boost::for_each(zip_iterator 与 std::for_each 类似):

      vector<double> pq;
      boost::for_each(
        p,q,
        [&pq](double p,double q) { 
          pq.push_back(p); pq.push_back(q);
        }
      );
      

      我没有针对 Jerry 的解决方案计时,我认为 Jerry 的解决方案更合适,但这是另一种选择,而且很容易理解

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多