首页 > 解决方案 > 在 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 

标签: c++algorithmstlc++14thrust

解决方案


cppreference/adjacent_difference

首先,创建一个acc类型为 InputIt 的值类型的累加器,用 初始化它*first,并将结果分配给*d_firsti然后,按顺序为每个迭代器[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.


推荐阅读