【问题标题】:Iterator over a unique element without construction a container在不构造容器的情况下对唯一元素进行迭代
【发布时间】:2017-09-02 21:49:25
【问题描述】:

我有一个框架,它需要一个迭代器作为输入。 但有时,我只有一个元素,所以构建容器似乎工作量太大。

T obj; // my unique object

std::vector<T> vec; // I want to avoid this
vec.push_back(T);

// Because the only use of the container is for this call
call(std::begin(vec), std::end(vec));

// I want to do something like that
call(BeginFakeSingletonIt<T>(obj), EndFakeSingletonIt<T>());

我可以创建一种特殊类型的迭代器,但标准库或 boost 中不存在类似的东西吗?

【问题讨论】:

  • 快速破解:call(&amp;obj, &amp;obj + 1);
  • @nwp:不是黑客,完全合法。
  • 如果您可以将代码重写为T obj[1];,那么您也可以使用std::begin(obj), std::end(obj)

标签: c++ boost iterator std


【解决方案1】:

单个元素可以被认为是一个大小为 1 的数组。因此,如果我们使用它,那么指向对象的指针将是指向数组开头的指针(迭代器)和指向过去的指针,那么数组的结尾将只是该指针递增一次。所以你可以做的是使用

call(&object, &object + 1)

现在您将只处理单个对象。

【讨论】:

    【解决方案2】:

    虽然已经有了答案,但我建议另一种方法:只需在您的调用中添加另一个重载,它本身接受一个元素,并让您的迭代器版本在循环中调用单个元素函数。

    这将使代码更简单,并在非内联情况下更好地优化代码。

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2010-12-21
      • 1970-01-01
      • 2017-05-24
      相关资源
      最近更新 更多