如何根据已排序索引的向量对 std::set 个索引进行排序?
How to sort std::set of indices according to the vector of sorted indices?
我有一个 class MyClass
,它使用一些双精度值 beta
,存储为 class 成员,在它的成员函数 g
中.它对它们进行排序并将排列存储在 class 成员 std::vector<int> sorted_beta_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];});
// ...
}
接下来我想在另一个成员函数 f
中有几个有序的索引集,它将按照与 sorted_beta_ind
中相同的顺序存储索引。我正在尝试使用 std::set
对象,因此,我需要一个比较器。我想出的最佳解决方案是 lambda 函数
double MyClass::f() {
auto ind_comp = [&order = sorted_beta_ind] (const int &a, const int &b) {
int pos_a = ~0, pos_b = ~0;
for(unsigned int i=0; i<order.size(); ++i) {
if(order[i] == a) {
pos_a = i;
}
if(order[i] == b) {
pos_b = i;
}
}
return pos_a < pos_b;
};
std::set<int, decltype(ind_comp)> d0, d1;
// the rest of the function which uses std::union and std::instersection
}
但是在构建项目时我得到了
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&)>&)’
这种方法行得通吗,还是我应该尝试完全不同的方法?
捕获 lambda 表达式,就像你的一样,不是 DefaultConstructible。这正是 std::set
试图做的,除非它收到一个可以作为构造函数调用参数复制的比较器对象。即:
std::set<int, decltype(ind_comp)> d0, d1;
这里 std::set
只知道比较器的类型,并将尝试使用其默认构造函数构造一个。相反,它应该是:
std::set<int, decltype(ind_comp)> d0(ind_comp), d1(ind_comp);
// ~~~~~~~^ ~~~~~~~^
我有一个 class MyClass
,它使用一些双精度值 beta
,存储为 class 成员,在它的成员函数 g
中.它对它们进行排序并将排列存储在 class 成员 std::vector<int> sorted_beta_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];});
// ...
}
接下来我想在另一个成员函数 f
中有几个有序的索引集,它将按照与 sorted_beta_ind
中相同的顺序存储索引。我正在尝试使用 std::set
对象,因此,我需要一个比较器。我想出的最佳解决方案是 lambda 函数
double MyClass::f() {
auto ind_comp = [&order = sorted_beta_ind] (const int &a, const int &b) {
int pos_a = ~0, pos_b = ~0;
for(unsigned int i=0; i<order.size(); ++i) {
if(order[i] == a) {
pos_a = i;
}
if(order[i] == b) {
pos_b = i;
}
}
return pos_a < pos_b;
};
std::set<int, decltype(ind_comp)> d0, d1;
// the rest of the function which uses std::union and std::instersection
}
但是在构建项目时我得到了
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&)>&)’
这种方法行得通吗,还是我应该尝试完全不同的方法?
捕获 lambda 表达式,就像你的一样,不是 DefaultConstructible。这正是 std::set
试图做的,除非它收到一个可以作为构造函数调用参数复制的比较器对象。即:
std::set<int, decltype(ind_comp)> d0, d1;
这里 std::set
只知道比较器的类型,并将尝试使用其默认构造函数构造一个。相反,它应该是:
std::set<int, decltype(ind_comp)> d0(ind_comp), d1(ind_comp);
// ~~~~~~~^ ~~~~~~~^