簡體   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