首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在传递给std算法的谓词中是否有获得元素偏移量的方法?

在传递给std算法的谓词中是否有获得元素偏移量的方法?
EN

Stack Overflow用户
提问于 2020-07-13 12:27:50
回答 2查看 114关注 0票数 0

算法库中使用的谓词/运算符接受各个迭代器的value_type的元素。我想编写一个谓词,它在范围内使用元素的偏移量。

例如,考虑以下代码

代码语言:javascript
运行
复制
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v{0, 1, 2, 3, 4, 5, 6};

    auto offset_value_mismatch = [&v](int const & x){
        return (x != (&x-&v.front()));
    };

    return std::any_of(v.begin(), v.end(), offset_value_mismatch);
}

我的问题是:

  1. 是否有一种“好的”方法(即比我上面介绍的更好)来在范围内找到元素的偏移量?
  2. 上述技术是否保证适用于任何数据类型(而不是int)?因为const &可以绑定到r值,所以我担心我可能会得到某个临时副本的地址。
  3. 对于关联的(非连续的)数据结构,可以实现类似的东西吗?
  4. 如果我使用接受std::ExecutionPolicy的算法重载,答案是否有变化?

编辑:

关于我的问题的更多信息:考虑在std::vector之上创建的多维数据结构。在这个数据结构中,索引是“管理的”,所以我可以同时对所有数据结构执行一些操作。此外,数据类型本身也可以是索引。

因此,当我修改索引时,我需要知道“域”索引和“范围”索引之间是否存在某种关系。

到目前为止,我使用了一个循环。我想看看是否可以通过使用标准的并行算法来提高性能。

编辑2:

最后,我实现了一个简单的基于顺序循环的算法,用于在域和范围都出现特定索引类型的情况下(罕见)。对于其他情况,上面的练习是不必要的,我可以用par_unseq执行策略加快60%的速度!(但不包括par,出于某种原因)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-13 12:44:17

  1. 是否有一种“好的”方法(即比我上面介绍的更好)来在范围内找到元素的偏移量?

不,一般不是。

  1. 上述技术是否保证适用于任何数据类型?

几乎(显然,您必须更改参数的类型,以对应正在迭代的任何数据类型)。您必须使用std::addressof,这样它才能处理重载运算符地址的类型(但是谁会这样做呢?)

  1. 类似的东西能为关联的数据结构实现吗?

不太像那样。您所展示的是有效的,但只适用于连续迭代器,即用于数组的迭代器(一般意义上,包括向量和字符串)。

假设您使用的是按顺序迭代元素的算法(这是执行策略确实重要的地方),那么一般的解决方案是使用累加器:

代码语言:javascript
运行
复制
auto offset_value_mismatch = [](auto& x) {
    static int i;
    return i++ == x;
}

  1. 如果我使用接受std::ExecutionPolicy的算法重载,答案是否有变化?

地址的减法和累加器都只使用顺序算法,而不是并行算法。从技术上讲,累加器可以使用锁来处理并行策略(但不是无序的),但据我所知,这样做没有好处。

票数 1
EN

Stack Overflow用户

发布于 2020-07-13 12:38:41

上述技术是否保证适用于任何数据类型(而不是int)?因为const &可以绑定到r值,所以我担心我可能会得到某个临时副本的地址。

不是的。这只适用于std::vectorstd::array或保证所有元素都存储在连续内存中的原始指针。但是,对于它们来说,它适用于存储在那里的任何数据类型。但是这一技术将导致UB,甚至对于来自std::deque的随机访问迭代器也是如此。

类似的东西能为关联的数据结构实现吗?

我对此表示怀疑,因为这甚至不适用于随机访问迭代器,例如前向迭代器的情况会更糟,看起来您有XY问题,需要指定您想要实现的目标。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62875854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档