c++ - 在 C++ STL 算法中,获取 lambda 函数内的值的索引?
问题描述
我想在std
算法的 lambda 函数中获取值的索引。这样,我就可以根据索引对值进行计算。我能够获得具有for_each
功能的索引。但是,我无法为std::adjacent_difference
. 你能帮我理解为什么我不能在其他使用二进制操作的算法中提取索引吗?我的尝试是以一种通用的方式尝试,该方式也适用于并行(推力)设置。所以,没有寻求一种计数的方法static
。
//~~~START:Mon, 04-Oct-2021, 13:03:46 IST
//~~~Author:Rajesh Pandian M | mrprajesh.co.in
#include <bits/stdc++.h>
void print(const auto &data){
std::copy(data.begin(),data.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}
int main(int argc, char* argv[]){
std::vector<int> data={0,2,3,5,10,11};
std::for_each(data.begin(), data.end(), [&data](int const& value) {
int idx = &value - &data[0];
std::cout<< "idx: " << idx << '\n';
});
print(data);
std::vector<int> result(data.size());
std::adjacent_difference(data.begin(), data.end(), result.begin(),
[&data]( const int& value2, const int& value1) {
int idx = &value2 - &data[0];
std::cout<< "idx: " << idx << '\n';
return value2-value1; //Some expression involving index, values[1,2]
});
print(result);
return 0;
}
输出:
idx: 0
idx: 1
idx: 2
idx: 3
idx: 4
idx: 5
0 2 3 5 10 11
idx: -102822055
idx: -102822055
idx: -102822055
idx: -102822055
idx: -102822055
0 2 1 2 5 1
解决方案
从cppreference/adjacent_difference:
首先,创建一个
acc
类型为 InputIt 的值类型的累加器,用 初始化它*first
,并将结果分配给*d_first
。i
然后,按顺序为每个迭代器[first + 1, last)
创建一个val
类型为 InputIt 的值类型的对象,用 初始化它*i
,计算val - acc
(C++20 前)val - std::move(acc)
(C++20 起) (重载 (1)) 或op(val, acc)
(C++ 前20)op(val, std::move(acc))
(C++20 起) (重载 (3)),将结果赋值给*(d_first + (i - first))
,并将赋值从val
移到acc
。
简而言之:二元运算符通过调用op(val,acc)
,既不是容器的元素val
也不acc
是容器的元素。
如果您需要索引,您可以填充std::vector<std::pair<size_t,int>>
这样的data[ i ].first == i
.
推荐阅读
- python - 我看不到我的列表中是否有重复的数字
- asynchronous - 如何转换未来的输出?
- angular-material - 在文件夹结构的内部级别使用 mat-icon 模块时出现问题
- yocto - 在 Yocto 中更新 wl18xx 驱动程序
- sql - jOOQ:DDLDatabase 生成器中是否存在可延迟约束的限制?
- python - 熊猫根据列值重复行
- java - Java Spring Hibernate Schema-Validation:缺少表
- java - 如何扫描特定目录以查找具有特定扩展名的文件?
- php - 显示短日而不是长日 PHP
- r - Dplyr group_by summarise 保留组内每列的最小值/最大值,具体取决于列后缀