【问题标题】:How can I get "address" of every Nth element of a vector如何获取向量的每个第 N 个元素的“地址”
【发布时间】:2019-02-28 18:25:29
【问题描述】:

如何在不使用“原始循环”的情况下获取向量的每个第 N 个元素的“地址”。 std::copy_if 似乎是一个解决方案,但我无法获取元素的地址,我只能获取值。

【问题讨论】:

  • 你想如何“获取地址”?你想要一个地址向量吗?用每个地址调用一个函数?有产生每个地址的函数吗?有一个生成地址的输入迭代器吗?
  • 听起来你想要skipping iterator
  • 地址向量。我尝试 std::transform 但它返回所有元素,我不想在 lambda 中保存计数器和 if 语句。
  • 向量存储在连续的内存范围中。因此,如果您有第一个元素&v[0] 的地址,您可以简单地将第 m-times.n 个元素计算为&v[0] + m * n * sizeof<T>,其中T 是向量元素的类型。

标签: c++ std stdvector


【解决方案1】:

您可以将跳过迭代器(也称为跨步迭代器)与std::for_each(或类似算法)一起使用。然而,标准库没有通用的跳过迭代器。

如果您希望自己实现一个跳过迭代器,想法很简单:编写一个将迭代器作为参数的模板。这个模板是一个迭代器“适配器”。将大部分迭代器样板委托给适配的迭代器,但实现自定义增量运算符,它会根据您的条件跳过元素。

虽然迭代器适配器是可重用的,并且现有的实现是可用的,但一个简单的循环可以少得多的工作:

for(size_t i = 0; i < v.size(); i += N)

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 2011-07-11
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2021-10-05
    • 2020-07-21
    相关资源
    最近更新 更多