【问题标题】:Output iterator that only counts the number of increments?只计算增量数的输出迭代器?
【发布时间】:2011-02-15 03:17:40
【问题描述】:

在 STL/Boost 中,是否有一个现成的输出迭代器,它只计算它增加的次数?当算法执行*iter = value 时,该值将被简单地丢弃。

如果没有,那么我自己的滚动似乎很容易。虽然如果有人发布了这样一个迭代器的示例,它可能对其他人有用。

【问题讨论】:

  • 你想用它做什么?你能想出一个例子吗?
  • std::count()std::count_if()。这些可以吗?
  • @wilhelm:假设我有一个算法findArticulations,它通过输出迭代器输出图中的关节点。我想编写另一个算法isBiconnected,利用已经存在的findArticulations
  • @wilhelmtell:是的,我想std::count 可以在我的示例中使用,但它需要将关节点不必要地复制到临时容器中才可以计算。
  • boost::counting_iterator 但我不确定它是否符合您的要求。它产生operator* 的计数。

标签: c++ boost stl iterator


【解决方案1】:

标准 C++ 中不存在这样的迭代器,据我所知,没有任何 Boost 迭代器具有这种确切的功能。不过,有很多方法可以使用这些库来做到这一点,而不必自己动手。例如,使用 Boost 的 function_output_iterator,您可以像这样构建一个计数器:

struct Counter {
    size_t* out;

    explicit Counter(size_t* where) : out(where) {
        // Handled in initializer list
    }

    /* Either make this a template, or make the class itself a template. */
    template <typename T> void operator()(T& value) {
        ++ *out;
    }
};

这个函子类型接收一个指向计数器变量的指针,然后每当调用它的operator() 时,计数器就会递增。如果您随后将其包装在 function_output_iterator 中,如下所示:

size_t count;
your_algorithm(begin, end,
              boost::make_function_output_iterator(Counter(&count)));

然后,每当创建的迭代器被写入时,您的operator() 就会被调用,并且计数器会递增。

希望这会有所帮助!

【讨论】:

  • +1 我敢打赌,有一种方法可以使用 boost lambda 将其变成单线。
  • @Emile Cormier-我还没有测试过这个,但也许像boost::bind(++*_1, &amp;count)
  • 这对我有用:std::copy( ar.begin(), ar.end(), boost::make_function_output_iterator(++boost::lambda::var(n)) );
  • @Emile Cormier:酷!或者,您可以执行[&amp;count](/* ... type ... */) {++count} 的整个 C++0x 协议。 :-)
  • 我将等待 C++ 专家最终确定 C++0x 规范,然后再尝试围绕那些新奇的 lambdas。 :-)
【解决方案2】:

是的。增强:

The counting iterator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2019-02-23
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多