1

以 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 算法和迭代器操作。升压也不错。

4

3 回答 3

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));
于 2013-04-21T03:26:38.667 回答
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是较小向量的大小。

于 2013-04-21T07:19:48.730 回答
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 的解决方案更合适,但这是另一种选择,很容易理解

于 2013-08-12T22:33:21.863 回答