Optimization 在交替元素时合并两个容器的stl样式是什么?

Optimization 在交替元素时合并两个容器的stl样式是什么?,optimization,boost,coding-style,iterator,stl-algorithm,Optimization,Boost,Coding Style,Iterator,Stl Algorithm,以STL样式而不是(;)执行以下操作的优雅方式是什么: 给定p={1,2,3}和q={7,8,9},我想把它合并成pq={1,7,2,8,3,9}。一个应用是创建用于积分位置偏差(q)和动量(p)的pq向量: for(size\u t i=0;i我不知道有哪种现有算法真正适合此任务。明显的替代方法是大致编写上述代码,但作为一种通用算法: template <class InIter1, class InIter2, class OutIter> OutIter unsorted_me

以STL样式而不是(;)执行以下操作的优雅方式是什么:

给定p={1,2,3}和q={7,8,9},我想把它合并成pq={1,7,2,8,3,9}。一个应用是创建用于积分位置偏差(q)和动量(p)的pq向量:


for(size\u t i=0;i我不知道有哪种现有算法真正适合此任务。明显的替代方法是大致编写上述代码,但作为一种通用算法:

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

如果您需要的话,没有交错两个数据结构的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是较小向量的大小。

使用lambda和
boost::for_each
(带有std::for_的zip_迭代器类似):

矢量pq;
boost::每个(
p、 q,,
[&pq](双p,双q){
pq.推回(p);pq.推回(q);
}
);

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

我知道,但它是不同的,因为这里的模式定义很好。这种情况在物理学中很常见,所以定制的解决方案很好“它有效…”它真的有效吗?当我小于6但大于2时,您的代码将出错…我猜
i
就是您的意思。@maditya谢谢,我更正了输入错误
unsorted_merge(p.begin(), p.end(), q.begin(), std::back_inserter(pq));
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;
}
vector<double> pq;
boost::for_each(
  p,q,
  [&pq](double p,double q) { 
    pq.push_back(p); pq.push_back(q);
  }
);