C++ 如何根据已排序索引的向量对std::索引集进行排序?

C++ 如何根据已排序索引的向量对std::索引集进行排序?,c++,gcc,c++17,gcc8,C++,Gcc,C++17,Gcc8,我有一个类MyClass,它使用一些双值beta,作为类成员存储在它的成员函数g中。它对它们进行排序,并将排列存储在类成员std::vector sorted\u beta\u ind: double MyClass::g() { // ... sorted_beta_ind.resize(n); for(unsigned int i=0; i<n; ++i) { sorted_beta_ind[i] = i; } std::sort(sorted_beta_i

我有一个类
MyClass
,它使用一些双值
beta
,作为类成员存储在它的成员函数
g
中。它对它们进行排序,并将排列存储在类成员
std::vector sorted\u beta\u ind

double MyClass::g() {
  // ...
  sorted_beta_ind.resize(n);
  for(unsigned int i=0; i<n; ++i) {
    sorted_beta_ind[i] = i;
  }
  std::sort(sorted_beta_ind.begin(), sorted_beta_ind.end(),
            [this] (const int &a, const int &b) {++op_cmp; return beta[a] > beta[b];});
  // ...
}
但是在建设这个项目的时候我得到了

error: use of deleted function ‘MyClass::f()::<lambda(const int&, const int&)>& MyClass::f(int**, int)::<lambda(const int&, const int&)>::operator=(const MyClass::f()::<lambda(const int&, const int&)>&)’
错误:使用已删除的函数'MyClass::f()::&MyClass::f(int**,int)::::运算符=(const MyClass::f():::&)'

这种方法有效吗?或者我应该尝试完全其他的方法吗?

捕获lambda表达式(如您的表达式)是不可默认构造的。这正是
std::set
试图做的,除非它接收到一个可以作为构造函数调用参数从中复制的comparator对象。即:

std::set<int, decltype(ind_comp)> d0, d1;

@Verloren Nevermind,没注意到你的lambda抓到了。PiotrSkotnicki,是的,我的错。@Verloren此数组再次执行两个集合的默认初始化。您需要指定这两个元素,例如,使用S=std::set来指定
;sd[2]{S(ind_comp),S(ind_comp)}不是那一行:)但我猜很可能您最终会尝试将一个集合复制分配给另一个集合,是吗?错误消息肯定会继续说“required from”,并在试图复制分配lambda的代码中给出行号expression@Verloren它最终应该指向您的代码。你没有显示完整的代码,所以我不知道出了什么问题。如果希望集合包含的索引与向量中的索引顺序相同,为什么不使用相同的比较函子?您使用这组索引的目的是什么?
map
std::set<int, decltype(ind_comp)> d0, d1;
std::set<int, decltype(ind_comp)> d0(ind_comp), d1(ind_comp);
//                                   ~~~~~~~^      ~~~~~~~^