如何使用某个局部变量创建一个始终排序元素的集合?
我想要做的一个简单的例子就是这个。
int x[5] {9, 2, 3, 1, 8};
set<int, ???> my_set;
my_set.insert(0);
my_set.insert(1);
my_set.insert(4);
for (int a : my_set)
cout << a << " "; // I want the answer 1 4 0 because x[1] < x[4] < x[0]
我想我可以使用struct
执行此操作,但我不确定如何使用x
更改内容。
答案 0 :(得分:8)
您可以使用lambda
进行设置int x[5] {9, 2, 3, 1, 8};
auto comparator = [&](int a, int b){ return x[a] < x[b]; };
std::set<int, decltype(comparator)> my_set(comparator);
答案 1 :(得分:3)
好吧,因为你正在“配对”元素,为什么不使用std::pair
?
#include <iostream>
#include <set>
int main()
{
int order[5] {9, 2, 3, 1, 8};
int data[3] {0, 1, 4};
std::set<std::pair<int, int>> s;
for (std::size_t i = 0; i < 3; ++i)
{
s.emplace(order[i], data[i]);
}
for (auto a : s)
std::cout << a.second << " ";
}
按预期输出1 4 0
。
答案 2 :(得分:2)
瞧!
#include <set>
#include <iostream>
int main()
{
int x[5] {9, 2, 3, 1, 8};
struct indirect_less
{
indirect_less(const int* p) : _p(p) {}
bool operator()(int l, int r) const {
return _p[l] < _p[r];
}
const int* _p;
};
std::set<int, indirect_less> my_set { indirect_less(x) };
my_set.insert(0);
my_set.insert(1);
my_set.insert(4);
for (int a : my_set) {
std::cout << a << " "; // I want the answer 1 4 0 because x[1] < x[4] < x[0]
}
std::cout << std::endl;
}
预期产出:
1 4 0
答案 3 :(得分:0)
你可以使用一对并用y对这些元素进行排序,x中的对总是有参考例
pair<0,9>
pair<1,2>
pair<2,3>
SORTED
pair<1,2>
pair<2,3>
pair<0,9>