我们可以使用前向迭代来擦除unordered_map中的元素吗?
unordered_map<string, int> employeeTable;
unordered_map<string, int>::iterator it;
for (it = employeeTable.begin(); it != employeeTable.end();) {
int age = it->second;
if (age < 18) {
employeeTable.erase(it++);
} else {
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
如果以上不正确,标准推荐什么?像下面的东西
it = employeeTable.erase(it);
Run Code Online (Sandbox Code Playgroud) 我希望boost::unordered_map在没有下载整个Boost包的情况下包含在我的项目中.我怎样才能做到这一点?
我有一个程序,它使用带有此定义的无序映射:
unordered_map<const char*, vector<pair<int, int> >, function<unsigned int (const char *str)> > myMap(30000, hashing);
Run Code Online (Sandbox Code Playgroud)
其中散列是一个用于散列键的函数.我的问题是 - >如何序列化这种结构并在之后反序列化?我真的需要它,并尽可能快速有效.我一直在阅读有关boost库的内容,但我不太了解如何将它们与这种东西一起使用.我知道有一些无序地图的升级库,但是,显然我做错了,编译器会抛出很多错误.有人可以给我一个示例代码,如何序列化这个?谢谢.
我正在使用这个无序的地图:
typedef unordered_map <char, void (*)()> Keymap;
Keymap keys;
Run Code Online (Sandbox Code Playgroud)
并尝试填写:
void assign(char key, void (*value)())
{
if (keys[key] == NULL)
keys.insert(Keymap::value_type(key, value));
else
keys[key] = value;
}
Run Code Online (Sandbox Code Playgroud)
指示:
keys.insert(Keymap::value_type(key, value));
Run Code Online (Sandbox Code Playgroud)
将char插入键中但值未初始化(NULL),因此我有一个带有('s',NULL)的映射而不是('s',function_pointer).
指令键[key] = value; 工作正常.
错误在哪里?
所以,伙计们,我std::unordered multimap只是为了好玩而玩.我想存储(在这个例子中)unsigned shorts,使用自定义哈希并且相等.
有趣的是什么?如果它们是偶数或奇数,则两个项目相等.
所以,据我所知,我不能使用std::unordered_map,即使实际值不同:自定义谓词另有说法.(如果我错了,请纠正我,显然!)
所以回顾一下:我存储不同的整数,因此存储不同的哈希值,但它们在谓词下的值可能是相同的.
#include <iostream>
#include <unordered_map>
class tt
{
public:
tt(const unsigned short v = 0) : i(v) { };
unsigned short i;
};
class tt_hash
{
public:
size_t operator()(const tt &v) const
{
auto f = std::hash<unsigned short>();
return f(v.i);
};
};
class tt_equal
{
public:
bool operator()(const tt &u, const tt &v) const
{
return (u.i % 2) == (v.i % …Run Code Online (Sandbox Code Playgroud) C++库中的内置映射和集合(包括unordered_map和multimap)要求find函数(用于查找特定元素)使用迭代器来遍历元素.C++参考站点声称使用这些数据结构查找元素平均需要时间,就像常规哈希表一样.但是,迭代器是否必须遍历整个列表,在找到元素之前平均得到这个O(n)时间?
鉴于:
unordered_map<string, float> my_map
Run Code Online (Sandbox Code Playgroud)
还有一对:
auto my_pair = make_pair("some_key", some_float);
Run Code Online (Sandbox Code Playgroud)
如果some_key不存在,如何有效地将对插入到地图中,
如果some_key存在,则自动添加some_float到密钥的现有值?
我目前的解决方案(或缺乏它,肯定有更优雅的方式):
auto added = my_map.emplace(my_pair);
if(!added.second) { // my_key already has an associated value
auto &curr_value = *my_map.first; // pointer to the existing pair
curr_value.second += my_pair.second; // add some_float
}
Run Code Online (Sandbox Code Playgroud) 我正试图将值放入std::unordered地图中,如下所示:
std::unordered_map<std::string, std::pair<std::string, std::string>> testmap;
testmap.emplace("a", "b", "c"));
Run Code Online (Sandbox Code Playgroud)
这是行不通的,原因是:
错误C2661:'std :: pair :: pair':没有重载函数需要3个参数
我已经看过这个答案和这个答案了,似乎我需要融入std::piecewise_construct进驻才能让它发挥作用,但我不认为我完全知道在这种情况下把它放在哪里.尝试像
testmap.emplace(std::piecewise_construct, "a", std::piecewise_construct, "b", "c"); // fails
testmap.emplace(std::piecewise_construct, "a", "b", "c"); // fails
testmap.emplace(std::piecewise_construct, "a", std::pair<std::string, std::string>( std::piecewise_construct, "b", "c")); // fails
Run Code Online (Sandbox Code Playgroud)
有什么方法可以得到这些值emplace吗?
我正在编译msvc2013,以防万一.
据我所知,std :: unordered_map用于快速访问元素。这是通过存储和比较密钥哈希而不是密钥本身来实现的。同样,无序意味着其中的元素未排序。但是要快速访问元素,需要对项目进行排序,以便能够使用二进制搜索找到请求的项目。
最后一个问题是为什么unordered_map不能像地图一样获得Compare模板参数?unordered_map如何仅通过相等的运算符比较键哈希?
template <class Key,
class T,
class Compare = less<Key>,
class Alloc = allocator<pair<const Key,T> >
> class map;
template <class Key,
class T,
class Hash = hash<Key>,
class Pred = equal_to<Key>,
class Alloc = allocator< pair<const Key,T> >
> class unordered_map;
Run Code Online (Sandbox Code Playgroud)据我所知,之间最快的一类float,并double依赖于本机ALU执行,通常是基于双精度。在基于逆向精度进行计算时,ALU必须始终执行相应的精度转换。
那么,为什么选择float代表该标准的标准load_factor呢?我想这是为了节省哈希表容器上的内存,但我想知道是否有更充分的理由。
unordered-map ×10
c++ ×9
c++11 ×3
boost ×2
hashmap ×2
dictionary ×1
hash ×1
hashtable ×1
multimap ×1
performance ×1
std-pair ×1
stl ×1
visual-c++ ×1