在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算法和迭代器操作。提升也很好。
答案 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是更正确的方式,但这是另一种选择,而且很容易理解