有没有办法将谓词中的元素偏移量传递给 std 算法?
Is there a way to get element's offset in predicates passed to std algorithms?
算法库中使用的谓词/运算符接受相应迭代器的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::ExecutionPolicy的算法重载,答案会改变吗
编辑:
有关我的问题的更多信息:考虑在std::vector
之上创建的多维数据结构。在这个数据结构中,索引是"0";被管理";,以便我可以同时对所有数据结构执行一些操作。此外,数据类型本身可以是索引。
因此,当我修改索引时,我需要知道";域";索引和";范围";指数
在这一点上,我使用了一个循环。我想看看我是否可以通过使用标准的并行算法来提高性能。
编辑#2:
我最终实现了一个简单的基于顺序循环的算法,用于(罕见的(某个索引类型同时出现在域和范围中的情况。对于其他情况,上面的练习是不必要的,并且我使用par_unseq
执行策略可以加快大约60%!(但由于某种原因,par
没有(。
以上技术是否保证适用于任何数据类型(代替int(?因为const&可以绑定到r值。我担心我可能会得到一些临时副本的地址。
否。这只适用于std::vector
或std::array
或保证所有元素存储在连续内存中的原始指针。对他们来说,它适用于存储在那里的任何数据类型。但是,即使对于来自std::deque
的随机访问迭代器,这种技术也会导致UB。
关联数据结构是否可以实现类似的功能?
我怀疑,因为这甚至不适用于随机访问迭代器,例如,前向迭代器的情况会更糟,看起来你有XY问题,需要指定你想要实现的目标。
- 是否存在"漂亮的";找到元素在该范围内的偏移的方法(即比我上面介绍的更好(
没有,一般情况下没有。
- 以上技术是否保证适用于任何数据类型
Almost(除了您显然必须更改参数的类型以对应于正在迭代的任何数据类型(。您必须使用std::addressof
才能处理重载addressof运算符的类型(但谁会这样做呢?(。
- 是否可以为关联数据结构实现类似的功能
不太像那样。您所展示的内容有效,但仅适用于连续迭代器,即数组的迭代器(一般意义上,包括向量和字符串(。
假设您使用的算法按顺序迭代元素(这就是执行策略非常重要的地方(,那么一般的解决方案是使用累加器:
auto offset_value_mismatch = [](auto& x) {
static int i;
return i++ == x;
}
- 如果我使用接受std::ExecutionPolicy的算法重载,答案会改变吗
地址减法和累加器只能使用顺序算法,而不能使用并行算法。从技术上讲,累加器可以使用锁与并行策略(但不是无序的(一起工作,但据我所知,这样做没有任何好处。
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- std::unordered_map 搜索算法是如何实现的?
- C++ — "算法"库和命名空间"std"
- 为什么范围算法与 std 的迭代器不兼容?
- 我对 std::unique(算法)C++有问题
- 如何在std算法中使用unique_ptr的transform_iterator
- 如何声明对STD算法的引用
- 最有cpu效率的方法是使用std::算法和变量函数模板的参数
- 为什么当我使用std::算法而不是纯循环时,这个代码会变慢
- 如何使用std算法来替换for循环
- std算法和副作用的并行实现
- 通过引用将函数对象传递到 std 算法中
- 输出“std::multiset”的唯一元素及其频率,使用C++中的std::算法(无循环)
- (Re)在非标准容器中使用std::算法
- 在c++中通过引用传递std算法谓词
- 以指向成员的指针作为比较器/"key"的 STD 算法
- 在std::map中查找输入数字的最近范围的最有效的std算法是什么?
- 为std算法函数创建一个包装器,用容器代替迭代器
- 如何以正确的方式在std算法中使用容器邻居
- 当使用STD::unique_ptr定义的一元运算时,STD算法中的术语不计算为1个参数