繁体   English   中英

将外部数据传递给 std::set 比较函子

[英]Passing external data to std::set Compare functor

这是一个人为的例子,我知道在这种情况下它没有意义。 在我的实际情况中, v包含一个更大的类,由于代码库中的其他依赖关系,我无法重构v 此外,在实际情况下,我没有使用std::set但它简化了示例。 这是我知道不起作用的两个示例类AB ,我确实理解为什么,但希望能说明我正在尝试做的事情:

#include <set>
#include <vector>

using namespace std;

struct A
{
    A(initializer_list<float> init) : v(init)
    {
        for(size_t i = 0; i < init.size(); ++i)
        {
            s.insert(i);
        }
    }

    struct Less
    {
        Less(const vector<float>& v) : v(v) {};

        bool operator()(size_t i, size_t j)
        {
            return v[i] < v[j];
        }

        const vector<float>& v;
    };

    vector<float> v;
    set<size_t, Less> s;
};

struct B
{
    B(initializer_list<float> init) : v(init)
    {
        for(size_t i = 0; i < init.size(); ++i)
        {
            s.insert(i);
        }
    }

    template<const vector<float>& v>
    struct Less
    {
        bool operator()(size_t i, size_t j)
        {
            return v[i] < v[j];
        }
    };

    vector<float> v;
    set<size_t, Less<v>> s;
};

int main()
{
    A a = {1., 2., 3.};
    B b = {1., 2., 3.};
}

在这两种情况下s包含引用v元素的索引, Less尝试使用这些索引比较v的值。 有没有办法做到这一点,我没有看到?

你的A方法几乎是正确的。 它只需要 2 个修复:

  • bool operator()(size_t i, size_t j)应该是const
  • s必须在构造期间传递给它的已配置函子。
struct A
{
    A(initializer_list<float> init) : v(init), s(v)
    {
        for(size_t i = 0; i < init.size(); ++i)
        {
            s.insert(i);
        }
    }

    // These must be manually defined if you need them, the default
    // ones won't be correct.
    A(const A&) = delete; 
    A& operator=(const A&) = delete;

    struct MyLess
    {
        MyLess(const vector<float>& v) : v(v) {};

        bool operator()(size_t i, size_t j) const
        {
            return v[i] < v[j];
        }

        const vector<float>& v;
    };

    vector<float> v;
    set<size_t, MyLess> s;
};

我正在使用 unordered_map 所以也许你的想法仍然有效?

是的,同样的原则适用于std::unordered_set 您只需要在构造过程中传入hashkey_equal 查看文档以确定要调用的正确构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM