【发布时间】:2014-01-08 19:04:02
【问题描述】:
让
typedef pair<int, double> Element;
然后我有两个向量:
vector<Element> A, B;
这些向量按Element.first 中的整数排序。我想得到第三个向量C,它是A 和B 的并集。这听起来像set_union,但是当A[i].first == B[j].first 时我需要不同的行为。 set_union 将简单地选择要包含在C 中的源元素之一,但我需要结果来“组合”这两个元素。换句话说,是这样的:
C[k].first = A[i].first; // == B[j].first. set_union does this
C[k].second = A[i].second + B[j].second; // set_union does NOT do this.
我很感兴趣是否可以使用标准库(或类似 Boost)。手动执行此操作的代码并不是特别复杂,但我不想重新发明轮子。
我能找到的唯一其他相关操作是merge。它也不合并元素,并且会涉及另一个合并过程。
【问题讨论】:
-
std::merge可以用一个非常聪明的输出迭代器做到这一点,但我认为一个新的算法会更好 -
@MooingDuck 你在想
back_inserter这样的东西,但它会检查新元素是否与前一个元素相同? -
我不敢苟同...这里的目标被误导了,标准算法和花哨的迭代器的任何“聪明”应用程序都会写得更慢,就像冗长和令人眼花缭乱一样复杂亚历克斯答案风格的明显循环方法。
-
@Praetorian:如果您创建一个包含对容器的引用的迭代器,它可以查看该容器的最后一个元素并将其与正在传递的元素进行比较,并决定是否应该推送将新元素添加到容器的末尾,或将其与前一个元素组合。
-
好的 - 我不明白
boost::function_output_iterator多么适合这个问题......同意这是一个很好的解决方案,可以在桌面上进行提升。 (否则,必须编写一个返回代理来捕获分配的迭代器是不值得大惊小怪的......)
标签: c++ boost c++11 vector set