我有与here、here或here相同的问题,除了我为参数和函数设置了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) 我有一个名为的抽象类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)
但这似乎非常低效。那么实现这一目标的最有效方法是什么?
我只是想用一个向量初始化一个 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)
我找到了一些资源,并尝试通过一个范围进行初始化,但它也不起作用!
我有以下代码迭代 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) 为什么有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) 我的 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)
谢谢,
我们以 unordered_set 为例。用于确定两个元素是否相等的默认谓词是std::equal_to<T>(t1,t2),它很简单t1==t2。现在让我们假设对于我已经实现的这个 T 类型operator==(),并不是所有的成员变量都是这个比较的一部分,即两个不同的 T 元素 t1,t2 在比较时可以相等。
如果底层哈希表为这些 t1 和 t2 中的每一个计算不同的哈希,它甚至何时执行t1==t2密钥重复检查?如果有更多的检查,它是如何平均保持恒定时间的?
我有一段简单的代码:
#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) 我正在解决一个 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) 我有以下 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 的默认构造函数?