什么是stl风格合并两个容器,同时交替元素?

时间:2013-04-21 03:09:50

标签: 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_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算法和迭代器操作。提升也很好。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

没有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 是较小向量的大小。

答案 2 :(得分:0)

使用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是更正确的方式,但这是另一种选择,而且很容易理解