C++:尝试引用已删除的函数 - int 的unordered_map

C++: Attempted to reference a deleted function - unordered_map for int

提问人:Toàn Trần 提问时间:11/13/2023 最后编辑:Toàn Trần 更新时间:11/13/2023 访问量:81

问:

我是 C++ 的新手,我正在尝试使用优先级队列实现 Dijkstra 的算法,找到源和目标之间的最短路径。我主要根据我的 Python 经验编写代码。但是我从文件中得到了这个错误:stunordered_mapinclude

'std::_Uhash_compare<_Kty,_Hasher,_Keyeq>::_Uhash_compare(const std::_Uhash_compare<_Kty,_Hasher,_Keyeq> &)': attempting to reference a deleted function

错误来自这一行:

    explicit _Umap_traits(const _Tr& _Traits) noexcept(is_nothrow_copy_constructible_v<_Tr>) : _Tr(_Traits) {}

这是我的代码:

#include <map>
#include <unordered_map>
#include <list>
#include <queue>
#include <iostream>

typedef std::pair<int, int> edge;
typedef std::unordered_map<edge, int> weights_map;
typedef std::map<int, std::list<int>> adjacents_map;

int Dijkstra(adjacents_map adjacents, weights_map weights, int s, int t) {
    std::unordered_map<int, int> dist = {};

    dist[s] = 0;

    std::unordered_map<int, int> prev = {};

    bool state = false;
    int UNDEFINED = -1;
    int big = 10000000;

    auto cmp = [&dist](int u, int v) { return dist[u] < dist[v]; }; // error is probably
    std::priority_queue<int, std::vector<int>, decltype(cmp)> Q(cmp); // from here

    for (int i = 1; i < adjacents.size() + 1; ++i) {
        if (i != s) {
            dist[i] = big;
            prev[i] = UNDEFINED;
        }
    }

    Q.push(s);
    while (!Q.empty() && !state) {
        int u = Q.top();
        Q.pop();

        if (u == t) {
            state = true;
        }

        for (auto const& v : adjacents[u]) {
            int alt = dist[u] + weights[std::make_pair(u, v)];
            if (alt < dist[v]) {
                dist[v] = alt;
                prev[v] = u;
                Q.push(v);
            }
        }
    }
    return dist[t];
}

我尝试使用unordered_map注释掉某些部分,更改一些变量以映射,但错误仍然存在。我猜错误来自优先级队列声明部分。任何帮助将不胜感激。

++ 的 C++17

评论

0赞 Tim Roberts 11/13/2023
你说“可能”。当然,错误输出会准确地告诉您哪一行触发了错误。
2赞 Yksisarvinen 11/13/2023
您需要习惯 C++ 错误的特定结构。这是错误的一部分 - 也可能有直接指向代码的错误。该错误是由于没有相应的专业化 - 您要么必须编写自己的专业化,要么使用 .std::pairstd::hashstd::mapstd::unordered_map
0赞 Igor Tandetnik 11/13/2023
标准库不提供 的专用化。因此,它不能用作开箱即用的密钥。std::hashstd::pairunordered_map
0赞 Toàn Trần 11/13/2023
哦,谢谢大家。我什至猜错了错误的行=))
0赞 Toàn Trần 11/13/2023
@Yksisarvinen这是我看到的唯一错误。我写错了代码注释。编辑。

答: 暂无答案