标签: unordered-map

错误:将“const …”作为“…”的“this”参数传递会丢弃限定符

我有与hereherehere相同的问题,除了我为参数和函数设置了const:

#include <unordered_map>
#include <functional>

namespace zzz {

struct identity_t {
    static const int ID_SIZE = 5;
    static const int LSB = 4; // = ID_SIZE - 1
    unsigned char id[ID_SIZE];
    inline bool operator< (const identity_t& rhs) const {
        for (int i = 0; i < ID_SIZE; i++) if (id[i] != rhs.id[i]) return (id[i] < rhs.id[i]);
        return false; // equal
    }
    unsigned char operator[] (const int& i) {return id[i];}
};

class hash_identity_t {
public:
    long …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map constants

0
推荐指数
1
解决办法
1万
查看次数

从 unordered_map 中删除值的有效方法,当只给出值 C++

我有一个名为的抽象类Object,我使用std::unordered_map<int, Object*> objects将这些Objects包含在一个名为DataSet. 每个对象都有一个id与之关联的对象。

通常,当从 my 中删除对象时unordered_map,我可以执行iterator = find(id)然后调用erase该迭代器。

这是简单而有效的。问题是,我必须实现一种方法来按值删除条目/对,而不是按键(这是我的id)。这给了我以下原型:

int DataSet::DeleteObject(Object* object)

实现这一目标的最有效方法是什么?我想我可以做这样的事情:

if(object){
    for(auto kv : objects) {
        if(kv.second == object) {
            objects.erase(kv);
        }
    }
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

但这似乎非常低效。那么实现这一目标的最有效方法是什么?

c++ iterator unordered-map

0
推荐指数
1
解决办法
6198
查看次数

用 C++ 中的向量初始化 unordered_map

我只是想用一个向量初始化一个 unordered_map。

当我尝试下面的代码时,代码无法编译。

用向量初始化 unordered_map 的最短语法是什么?您将如何在不使用循环的情况下实现以下方法。

unordered_map<int, int> convertToMap(const vector<int>& v) 
{
  unordered_map<int, int> umap(v.begin(), v.end());

  return umap;
}
Run Code Online (Sandbox Code Playgroud)

我找到了一些资源,并尝试通过一个范围进行初始化,但它也不起作用!

初始化无序映射

c++ unordered-map initialization

0
推荐指数
1
解决办法
3348
查看次数

unordered_map 不迭代所有键

我有以下代码迭代 unordered_map 中的所有键,同时迭代我将映射传递给其他函数。由于某种原因,迭代器无法迭代所有键。我无法弄清楚为什么以及如何解决这个问题。如果我将地图作为值而不是引用传递,那么它会按预期工作,但我想通过引用传递来保存副本。

代码:

void DFS(char curr, unordered_map<char, unordered_set<char>>& G) {
    cout << "Traversing: " << curr << endl;
    for(const char& ch: G[curr]) {
        DFS(ch, G);
    }
}

int main() {
    unordered_map<char, unordered_set<char>> G;

    G['c'].emplace('b');
    G['b'].emplace('a');

    for(auto it : G) {
        cout << "Starting with: " << it.first << endl;
        DFS(it.first, G);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

Starting with: b
Traversing: b
Traversing: a
Run Code Online (Sandbox Code Playgroud)

请注意,它不是遍历 key c

更新: 更改 DFS 函数以使地图 const 如下所示也无济于事:

void DFS(const char curr, const unordered_map<char, unordered_set<char>>& G) …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map

0
推荐指数
1
解决办法
159
查看次数

unordered_set count 函数返回错误值

为什么有a时set.count('a')输出?13

程序:

bool isAnagram(string s, string t) {

    unordered_set<char> set;

    for(int i=0; i<s.size(); i++){
        set.insert(s[i]);
    }

    cout << endl << set.count('a') << endl;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

输入:

s = 'anagram'
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map unordered-set

0
推荐指数
1
解决办法
127
查看次数

带有默认构造函数的 unordered_map emplace

我的 unordered_map 分别带有 string 和 aClass 类型的键值对;aClass 不能移动的地方(它有一个互斥锁)。我也不希望它是复制构造的;我认为复制构造一个包含互斥锁的类是不明智的。为了将项目的构建延迟到其插入到地图中,我尝试使用 emplace 将其插入到地图中,因此,第二个参数必须为空:

aList.emplace("aString");
Run Code Online (Sandbox Code Playgroud)

但是,前一行不起作用。任何想法如何使用默认构造函数放置?我也试过:

aList.emplace("aString", void);
aList.emplace("aString", {});
aList.emplace(std::piecewise_construct,"aString");
Run Code Online (Sandbox Code Playgroud)

谢谢,

c++ unordered-map emplace c++14

0
推荐指数
1
解决办法
688
查看次数

C++:无序容器如何防止重复?

我们以 unordered_set 为例。用于确定两个元素是否相等的默认谓词是std::equal_to<T>(t1,t2),它很简单t1==t2。现在让我们假设对于我已经实现的这个 T 类型operator==(),并不是所有的成员变量都是这个比较的一部分,即两个不同的 T 元素 t1,t2 在比较时可以相等。

如果底层哈希表为这些 t1 和 t2 中的每一个计算不同的哈希,它甚至何时执行t1==t2密钥重复检查?如果有更多的检查,它是如何平均保持恒定时间的?

c++ hash stl unordered-map unordered-set

0
推荐指数
1
解决办法
72
查看次数

std::unordered_map::clear() 有什么作用?

我有一段简单的代码:

#pragma GCC optimize ("O0")
#include <unordered_map>
int main()
{
    std::unordered_map<int, int> map;
        
    static constexpr const int MaxN = 2e6 + 69;
    map.reserve(MaxN);
    
    int t = 1000;
    while (t--)
    {
        map.clear();
    }
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码所做的只是创建一个巨大的std::unordered_map,在堆上保留大量内存,同时仍然保持为空,并清除 1000 次。令我惊讶的是,执行这个程序需要一秒钟多的时间。

根据cppreference元素std::unordered_map::clear数量是线性的,它是 0,而不是桶的数量。因此,这个函数在我的程序中应该什么都不做,而且应该不到一毫秒。

试图进一步分析代码,我写了这个:

#pragma GCC optimize ("O0")
#include <chrono>
#include <iostream>
#include <unordered_map>

#include <map>
template <typename T>
struct verbose_pointer
{
    using element_type = T;
    T* value = nullptr;
    static std::map<T*, std::size_t> accessTimes; …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map std

0
推荐指数
1
解决办法
449
查看次数

C++更新unordered_map中的值,其中键值对的数据类型为int-unordered_set

我正在解决一个 DSA 问题,并在 C++ 标准模板库中观察到一个稍微奇怪的行为:

    vector<int> v = {1, 7, 8, 3, 12};

    unordered_map<int, unordered_set<int>> ump;

    for (int i=0; i<v.size(); i++) {
        unordered_set<int> us;
        us.insert(56);
        ump.insert(mp(v[i], us));
    }
    
    for (int i=0; i<v.size(); i++) {
        unordered_set<int> us = ump.find(v[i])->second;
        us.insert(67);
    }

    for (auto it = ump.begin(); it != ump.end(); it++) {
        cout << it->first << ": ";
        for (auto ait = it->second.begin(); ait!=it->second.end(); ait++) {
            cout << *ait << ' ';
        }
        cout << '\n';
    }

Run Code Online (Sandbox Code Playgroud)

这里的输出是:

    vector<int> v = {1, …
Run Code Online (Sandbox Code Playgroud)

c++ pointers stl unordered-map unordered-set

0
推荐指数
1
解决办法
51
查看次数

显式默认的默认构造函数被隐式删除,因为 unordered_map 与结构一起用作键

我有以下 Graph 类:

class Graph {
private:
    struct Edge {
        string vertex1{}, vertex2{};
        int val{};

        Edge() = default;
        ~Edge() = default;
        explicit Edge(string v1, string v2, int value) : vertex1(std::move(v1)), vertex2(std::move(v2)), val(value) {};
        bool operator==(const Edge&) const;
    };

    unordered_map<Edge, Edge*> edges;

public:
    Graph() = default;
    ~Graph();
}
Run Code Online (Sandbox Code Playgroud)

当我想用默认构造函数构造一个 Graph 时,它说Explicitly defaulted default constructor of 'Graph' is implicitly deleted because field 'edges' has a deleted default constructor. 我应该如何更改我的代码,以便能够使用 Graph 的默认构造函数?

c++ unordered-map default-constructor

0
推荐指数
1
解决办法
495
查看次数