[英]'No matching function for call' error when inserting class into a STL map
[英]Error “bad function call” when passing lambda to STL set
我正在嘗試將lambda作為排序標准傳遞給int類型的一組索引。 我使用了unordered_map將索引映射到它們的值,然后按值將其傳遞給具有兩個索引並返回bool的lambda。
代碼可以編譯,但是在運行時出現“錯誤的函數調用”錯誤。
我使用了std :: function <>類型包裝器來聲明lambda,而不是使用給出錯誤的decltype()。
碼:
#include <iostream>
#include <unordered_map>
#include <functional>
#include <set>
#include <vector>
using namespace std;
int main()
{
int T;
cin >> T;
while (T--)
{
int N;
cin >> N;
unordered_map<int, int> M;
function<bool(int, int)> l = [M](int i1, int i2)->bool { return M.at(i1) > M.at(i2); };
set<int, function<bool(int, int)>> S;
for (int i = 1; i <= N; ++i)
{
int p;
cin >> p;
M[i] = p;
S.insert(i);
}
vector<vector<int>> Adj(N + 1);
for (int i = 1; i <= N - 1; ++i)
{
int u, v;
cin >> u >> v;
Adj[u].push_back(v);
Adj[v].push_back(u);
}
int maximum = 0;
for (int i = 1; i <= N; ++i)
{
S.erase(i);
for (int e : Adj[i])
S.erase(e);
cout << *S.cbegin() << ' ';
for (int e : Adj[i])
S.insert(e);
S.insert(i);
}
cout << endl;
}
}
輸入:
1
6
5 10 15 20 25 30
1 3
2 3
3 4
4 5
4 6
我在try-catch塊中包含此代碼,當我輸入第二個值(輸入中為10)時,它正在打印“錯誤的函數調用”
我在try-catch塊中包含此代碼,並且正在打印“錯誤的函數調用”
當您嘗試調用默認的初始化std::function
時,會發生這種情況:
std :: bad_function_call如果*這不存儲可調用函數目標,即!* this == true。
在std::function>::operator()
文檔中提供
當您使用std::set
默認ctor初始化對象時,不要將函子傳遞給std::set
構造函數:
set<int, function<bool(int, int)>> S;
因此應改用:
set<int, function<bool(int, int)>> S( l );
並且您的Lambda應該通過引用捕獲M
,因為您稍后對M
所做的任何更改都不會反映在此Lambda中,因為它會通過值捕獲M
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.