[英]Passing external data to std::set Compare functor
這是一個人為的例子,我知道在這種情況下它沒有意義。 在我的實際情況中, v
包含一個更大的類,由於代碼庫中的其他依賴關系,我無法重構v
。 此外,在實際情況下,我沒有使用std::set
但它簡化了示例。 這是我知道不起作用的兩個示例類A
和B
,我確實理解為什么,但希望能說明我正在嘗試做的事情:
#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
。 您只需要在構造過程中傳入hash
和key_equal
。 查看文檔以確定要調用的正確構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.