0

我正在思考 STL 迭代器的当前限制,并想知道是否有一种优雅的方法来解决它。这是我的情况:我有一个类,它封装了一个序列容器和一个通用方法来改变容器的内容,例如:

class Container {
  typedef std::vector<int> Data;
  Data data_;
 public:
  template <class Mutator>
  ?? mutate() {
    Mutator m;
    return m(??);
  }
};

为简洁起见,省略了一些细节,但我正在考虑的主要问题是将什么传递给 mutator(m() 仿函数调用中的 ??)。第二个问题是从 mutate 返回什么以允许对 mutator 进行简单组合。一种可能性是将一对开始/结束迭代器传递(并返回)到 data_,甚至是 boost::sub_range,例如:

template <class Mutator>
boost::sub_range<Data> mutate() {
  Mutator m;
  return m(boost::sub_range<Data>(data_);
}

这将允许我对数据执行大部分我想要的操作,例如否定范围内的所有值、乘以一个因子等。这也允许我链接或组合各种变异器,就像在这个(缩短的)版本中一样:

return m1(m2(m3(data_)));

因此,例如,任何 mutator 都可以选择其输入的一个子范围来限制外部 mutator 工作的范围,这是一个理想的特性。所有这些mutators都可以就地更改数据,这非常有效。

然而,这种语法不能做的是修改容器的大小(至少不能使用向量),因此插入或删除元素的 mutator 不能与基于迭代器的接口一起使用。另一个接口将整个容器传递给 mutator。我不确定在这种情况下如何处理子范围,而且它也感觉不像基于通用和最低要求的基于迭代器的解决方案那样优雅的解决方案。

我将不胜感激有关如何处理此限制的任何想法。

4

1 回答 1

0

您可以将仿函数(思考:函数组合)与boost::bind 结合起来。

另一方面,我觉得我不完全理解:第二个仿函数是否应该在与第一个仿函数不同的范围内工作?数据会从容器中删除吗?

请注意:您当前的解决方案具有不明显的成本:“突变器”的每个组合都需要新的迭代,而不是“突变器的真正组合”。

于 2010-06-20T22:09:33.117 回答