下面是使用独立的通用算法
merge_elements
实现的示例:
#include <algorithm>
#include <utility>
template <typename LInput, typename RInput, typename Output>
Output merge_elements(LInput lbegin, LInput lend,
RInput rbegin, RInput rend,
Output out) {
while(true) {
if (lbegin == lend) {
return std::copy(rbegin, rend, out);
}
if (rbegin == rend) {
return std::copy(lbegin, lend, out);
}
if (lbegin->first < rbegin->first) {
*out++ = *lbegin++;
} else if (rbegin->first < lbegin->first) {
*out++ = *rbegin++;
} else {
*out++ = std::make_pair(lbegin->first, lbegin->second + rbegin->second);
++lbegin;
++rbegin;
}
}
}
#include <iostream>
#include <iterator>
#include <vector>
using Elem = std::pair<int, double>;
using Elems = std::vector<Elem>;
int main() {
Elems lhs {{1, 2.3}, {2, 3}, {5, 3.4}};
Elems rhs {{1, 1.3}, {3, 5.5}, {4, 2.2}};
Elems result;
merge_elements(std::begin(lhs),
std::end(lhs),
std::begin(rhs),
std::end(rhs),
std::back_inserter(result));
for (const auto &elem : result) {
std::cout << elem.first << ' ' << elem.second << std::endl;
}
}
它不需要boost,但与mpark的boost解决方案几乎具有完全相同的总行数。有趣的是,这个算法足够通用,可以不变地与
std::map<int,double>
以及
std::vector<std::pair<int,double>>
一起使用:
#include <iostream>
#include <iterator>
#include <map>
using Elems = std::map<int, double>;
int main() {
Elems lhs {{1, 2.3}, {2, 3}, {5, 3.4}};
Elems rhs {{1, 1.3}, {3, 5.5}, {4, 2.2}};
Elems result;
merge_elements(std::begin(lhs),
std::end(lhs),
std::begin(rhs),
std::end(rhs),
std::inserter(result, result.begin()));
for (const auto &elem : result) {
std::cout << elem.first << ' ' << elem.second << std::endl;
}
}
std::merge
可以使用非常聪明的输出迭代器来完成,但 - Mooing Duckstd::merge
做您想要的事情,我会支持 TonyD 的观点,即编写自定义算法是正确的方法。 - Praetorianboost::function_output_iterator
很适合这个问题...同意在使用 boost 的情况下,这是一个很好的解决方案。(如果没有 boost,编写一个返回代理以捕获赋值的迭代器就不值得麻烦了...) - Tony Delroy