算法库中使用的谓词/运算符接受各个迭代器的value_type的元素。我想编写一个谓词,它在范围内使用元素的偏移量。
例如,考虑以下代码
#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);
}
我的问题是:
int
)?因为const &
可以绑定到r值,所以我担心我可能会得到某个临时副本的地址。编辑:
关于我的问题的更多信息:考虑在std::vector
之上创建的多维数据结构。在这个数据结构中,索引是“管理的”,所以我可以同时对所有数据结构执行一些操作。此外,数据类型本身也可以是索引。
因此,当我修改索引时,我需要知道“域”索引和“范围”索引之间是否存在某种关系。
到目前为止,我使用了一个循环。我想看看是否可以通过使用标准的并行算法来提高性能。
编辑2:
最后,我实现了一个简单的基于顺序循环的算法,用于在域和范围都出现特定索引类型的情况下(罕见)。对于其他情况,上面的练习是不必要的,我可以用par_unseq
执行策略加快60%的速度!(但不包括par
,出于某种原因)。
发布于 2020-07-13 04:44:17
不,一般不是。
几乎(显然,您必须更改参数的类型,以对应正在迭代的任何数据类型)。您必须使用std::addressof
,这样它才能处理重载运算符地址的类型(但是谁会这样做呢?)
不太像那样。您所展示的是有效的,但只适用于连续迭代器,即用于数组的迭代器(一般意义上,包括向量和字符串)。
假设您使用的是按顺序迭代元素的算法(这是执行策略确实重要的地方),那么一般的解决方案是使用累加器:
auto offset_value_mismatch = [](auto& x) {
static int i;
return i++ == x;
}
地址的减法和累加器都只使用顺序算法,而不是并行算法。从技术上讲,累加器可以使用锁来处理并行策略(但不是无序的),但据我所知,这样做没有好处。
发布于 2020-07-13 04:38:41
上述技术是否保证适用于任何数据类型(而不是int)?因为const &可以绑定到r值,所以我担心我可能会得到某个临时副本的地址。
不是的。这只适用于std::vector
或std::array
或保证所有元素都存储在连续内存中的原始指针。但是,对于它们来说,它适用于存储在那里的任何数据类型。但是这一技术将导致UB,甚至对于来自std::deque
的随机访问迭代器也是如此。
类似的东西能为关联的数据结构实现吗?
我对此表示怀疑,因为这甚至不适用于随机访问迭代器,例如前向迭代器的情况会更糟,看起来您有XY问题,需要指定您想要实现的目标。
https://stackoverflow.com/questions/62875854
复制