使用迭代器执行对象操作的函数

时间:2017-01-13 12:44:30

标签: c++ c++11 templates iterator containers

假设我有std::array<SomeType, N>并且我想调用一个函数,该函数使用迭代器来处理std::array中的对象,但不知道容器是std::array

SomeType是一个具有公共成员函数doSomething()

的类

例如,函数可能是:

template<typename Iterator>
void action(Iterator &beg, Iterator &end) {
  for (; beg != end; ++beg)
    beg->doSomething();
}

可以通过以下方式调用此功能:

int main() {
  std::array<SomeType, 10> a;

  action<std::array<SomeType, 10>::iterator>(a.begin(), a.end());
}

但我想知道这是不是这样做的?特别是因为模板可以用于每个类。有没有办法将函数限制为SomeType而不让函数知道容器是std::array

2 个答案:

答案 0 :(得分:5)

  1. 修复您的代码:您不应该要求左值参数。实际上,迭代器应该是可以有效复制的。

    @@PROCID
  2. 让模板参数推断完成它的工作:

    template<typename Iterator>
    void action(Iterator beg, Iterator end)
    //          ^^^^^^^^^^^^  ^^^^^^^^^^^^
    

答案 1 :(得分:0)

请注意,标准库已经有许多算法,涵盖了“在某个容器中在某个范围内执行相同操作”的一般情况:

#include <array>
#include <vector>
#include <algorithm>
#include <numeric>
#include <iterator>

struct SomeType
{
  void doSomething();

  SomeType mutatedCopy() const;

  int someValue() const;
};

int add_value(int i, const SomeType& st) {
  return i + st.someValue();
}

void call_something(SomeType& st) { st.doSomething(); }
auto mutate_copy(SomeType const& st) { return st.mutatedCopy(); }

int main() {
  std::array<SomeType, 10> a;
  std::vector<SomeType> b;

  std::for_each(a.begin(), a.end(), call_something);
  std::for_each(b.begin(), b.end(), call_something);

  std::transform(a.begin(), a.end(), a.begin(), mutate_copy);
  std::transform(b.begin(), b.end(), b.begin(), mutate_copy);

  auto tot = std::accumulate(a.begin(), a.end(), 0, add_value)
           + std::accumulate(b.begin(), b.end(), 0, add_value);

  // you can even transform into dissimilar containers:

  std::transform(a.begin(), a.end(), std::back_inserter(b), mutate_copy);

}