如何使用局部变量创建元素排序集?

时间:2016-05-11 21:15:08

标签: c++ set

如何使用某个局部变量创建一个始终排序元素的集合?

我想要做的一个简单的例子就是这个。

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更改内容。

4 个答案:

答案 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>