有没有办法将 set 与在线比较器一起使用?
is there a way to use set with online comparator?
我想使用 set 或 multiset 和比较器 lambda 函数制作一个 RedBlackTree,并且该函数使用数组(为简单起见全局)
当程序 运行
时数组正在改变
#include <iostream>
#include <set>
using namespace std;
int v[10];
auto x = [](pair<int, int> p1, pair<int, int> p2) { return p1.second+v[p1.first] < p2.second+v[p2.first]; };
set<pair<int, int>, decltype(x)> s(x);
// i tested multiset with same answer
int main()
{
s.insert({3, 2});
s.insert({4, 1});
s.insert({2, 10});
s.insert({8, 8});
v[2]=-100;
for (auto x : s)
cout << x.first<<":"<<x.second << endl;
}
预计:
2:10
4:1
3:2
8:8
但我明白了:
4:1
3:2
8:8
2:10
the array is changing while program is running
您不能拥有像那样改变其行为的比较器函数。
在您的示例中,set
是在 v[2]=-100;
赋值之前构造的,它恰好在您进行赋值后保持其顺序,但这不是保证的行为。
顺便说一句,#include <bits/stdc++.h>
是非标准的,会让你在这个网站上被否决。
我想使用 set 或 multiset 和比较器 lambda 函数制作一个 RedBlackTree,并且该函数使用数组(为简单起见全局) 当程序 运行
时数组正在改变#include <iostream>
#include <set>
using namespace std;
int v[10];
auto x = [](pair<int, int> p1, pair<int, int> p2) { return p1.second+v[p1.first] < p2.second+v[p2.first]; };
set<pair<int, int>, decltype(x)> s(x);
// i tested multiset with same answer
int main()
{
s.insert({3, 2});
s.insert({4, 1});
s.insert({2, 10});
s.insert({8, 8});
v[2]=-100;
for (auto x : s)
cout << x.first<<":"<<x.second << endl;
}
预计:
2:10
4:1
3:2
8:8
但我明白了:
4:1
3:2
8:8
2:10
the array is changing while program is running
您不能拥有像那样改变其行为的比较器函数。
在您的示例中,set
是在 v[2]=-100;
赋值之前构造的,它恰好在您进行赋值后保持其顺序,但这不是保证的行为。
顺便说一句,#include <bits/stdc++.h>
是非标准的,会让你在这个网站上被否决。