代码之家  ›  专栏  ›  技术社区  ›  Adrian McCarthy

汇集多个捐助者的捐款

  •  1
  • Adrian McCarthy  · 技术社区  · 17 年前

    当我尝试使我的C++技能现代化时,我一直遇到这种情形:“STL方式”对我来说并不明显。

    std::vector )。每个源都是一个对象,每个对象都提供一个方法 get_contributions() 返回任意数量的贡献(从0到多)。采集者会打电话来 获取您的贡献()

    获取您的贡献()

    std::vector<contribution> get_contributions() const

    这是最简单的,但它会导致大量复制,因为gatherer会将每组结果复制到主集合中。是的,性能在这里很重要。例如,如果贡献者是几何模型,并且获得贡献相当于将它们细分为三角形进行渲染,那么速度很重要,贡献的数量可能非常巨大。

    template <typename container> void get_contributions(container &target) const

    这允许每个参与者通过调用 target.push_back(foo) . 这里的缺点是,我们将容器暴露于其他类型的检查和操作中。我希望界面尽可能窄。

    备选案文3: template <typename out_it> void get_contributions(out_it &it) const

    std::back_insert_iterator 对于主集合,每个贡献者都可以 *it++ = foo; 每一份捐款。这是到目前为止我想到的最好的,但我觉得必须有一种更优雅的方式。这个 back_insert_iterator 感觉像是一堆乱七八糟的东西。

    3 回复  |  直到 17 年前
        1
  •  2
  •   dirkgently    17 年前

    还有第四个,需要定义迭代器范围。查看Alexandrescu在 "Iterators must go" .

        2
  •  1
  •   Stack Overflow is garbage    17 年前

    back_insert_iterator

    但这并不是一个难题。它就是为了这个目的而设计的。

    一个小的调整是按值传递迭代器,然后在函数返回时返回它。

        3
  •  0
  •   James Hopkin    17 年前

    我想说有两种惯用的STL方法:选项3(顺便说一句,使用一个输出迭代器,通过值传递)和一个函子,每个贡献都会调用它。

    当然,只有当适合将get_贡献作为模板实现时,以上每一项才是合适的。