我正在使用unordered_maps的unordered_map,这样我就可以使用"多键"语法引用一个元素:
my_map[k1][k2].
有没有一种方便的方法来使用相同的"多键"语法来检查元素是否存在,然后再尝试访问它?如果没有,最简单的方法是什么?
我想从std::unordered_map(直方图)中删除元素(直方图箱),这些元素(直方图)满足作为lambda表达式给出的预测(直方图箱具有零计数),如下所示
std::remove_if(begin(m_map), end(m_map), [](const Bin & bin) { return bin.second == 0; });
Run Code Online (Sandbox Code Playgroud)
但GCC-4.6.1抱怨如下
/usr/include/c++/4.6/bits/stl_pair.h:156:2: error: assignment of read-only member ‘std::pair<const unsigned char, unsigned char>::first’
/usr/include/c++/4.6/bits/stl_pair.h: In member function ‘std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(std::pair<_T1, _T2>&&) [with _T1 = const unsigned char, _T2 = long unsigned int, std::pair<_T1, _T2> = std::pair<const unsigned char, long unsigned int>]’:
/usr/include/c++/4.6/bits/stl_algo.h:1149:13: instantiated from ‘_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = std::__detail::_Hashtable_iterator<std::pair<const unsigned char, long unsigned int>, false, false>, _Predicate = pnw::histogram<V, C, H>::pack() [with …Run Code Online (Sandbox Code Playgroud) According to cppreference.com, std::map::operator[] for non-existing value does zero-initialization.
However, the same site does not mention zero-initialization for std::unordered_map::operator[], except it does have an example which relies on this.
Of course this is just a reference site, not the standard. So, is the code below ok or not?
#include <unordered_map>
int main() {
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
}
Run Code Online (Sandbox Code Playgroud) 我正在使用std::unordered_mapfrom gnu ++ 0x来存储大量数据.我想为大量元素预先分配空间,因为我可以限制使用的总空间.
我希望能够做的是致电:
std::unordered_map m;
m.resize(pow(2,x));
Run Code Online (Sandbox Code Playgroud)
其中x是已知的.
std::unordered_map不支持这个.我希望std::unordered_map尽可能使用,因为它最终会成为标准的一部分.
一些其他约束:
需要可靠的O(1)访问和地图的变异.期望的散列和比较函数已经是非标准的并且有些昂贵.O(log n)突变(如同std::map)太昂贵了.
- >昂贵的哈希和比较也使基于摊销的增长方式过于昂贵.每个额外插入都需要来自这些函数的O(n)运算,这导致算法运行时间中的额外二次项,因为指数存储要求需要O(n)增长.
确定unordered_map容器是否具有指定键的项目的最快方法是什么?
C++ 11的unordered_map默认构造函数如下所示:
explicit unordered_map( size_type bucket_count = /*implementation-defined*/,
const hasher& hash = hasher(),
const key_equal& equal = key_equal(),
const allocator_type& alloc = allocator_type() );
Run Code Online (Sandbox Code Playgroud)
我想unordered_map用自定义哈希函数创建一个,但它是构造函数的第二个参数.
我应该使用什么桶数?是否有一个神奇的价值我可以用来告诉容器自己决定?否则,是否有一种启发式方法可以根据我期望我的地图包含的键数来猜测一个好的桶号?我应该关心吗?
在使用Boost的C++程序中,我正在尝试构建一个无序映射,其键是双精度元组:
typedef boost::tuples::tuple<double, double, double, double> Edge;
typedef boost::unordered_map< Edge, int > EdgeMap;
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用键和值填充它时,初始化地图就完成了
EdgeMap map;
Edge key (0.0, 0.1, 1.1, 1.1);
map[key] = 1;
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误消息:
/usr/include/boost/functional/hash/extensions.hpp:176: error: no matching function for call to ‘hash_value(const boost::tuples::tuple<double, double, double, double, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>&)’
Run Code Online (Sandbox Code Playgroud)
我认为这是因为我需要为元组键指定一个哈希函数.我怎样才能做到这一点?
编辑:
根据以下建议,我写了以下实现:
#include <boost/tuple/tuple.hpp>
#include <boost/unordered_map.hpp>
typedef boost::tuples::tuple<double, double, double, double> Edge;
struct ihash
: std::unary_function<Edge, std::size_t>
{
std::size_t operator()(Edge const& e) const
{
std::size_t seed = 0;
boost::hash_combine( seed, e.get<0>() );
boost::hash_combine( seed, …Run Code Online (Sandbox Code Playgroud) 我有一个std :: unordered_map,我将从via迭代中删除元素.
auto itr = myMap.begin();
while (itr != myMap.end()) {
if (/* removal condition */) {
itr = myMap.erase(itr);
} else {
++itr;
}
}
Run Code Online (Sandbox Code Playgroud)
我想阻止地图执行任何昂贵的操作,直到我完成删除我需要删除的所有元素.我有一个有效的顾虑吗?我误解了内部存储的工作原理吗?
在Java的hashmap中:
map.put(key, new_value)
Run Code Online (Sandbox Code Playgroud)
将使用new_value更新key = key的条目(如果它存在于hashmap中).
在C++ 11的unordered_map中执行类似操作的正确方法是什么?
我没有找到类似updateXXX的API,文档说unordered_map :: insert函数只有在没有任何这样的密钥对时才会成功.
我需要像这样定义一个unordered_map unordered_map<pair<int, int>, *Foo>,定义和传递一个hash和equal函数到这个地图的语法是什么?
我试过传递给它这个对象:
class pairHash{
public:
long operator()(const pair<int, int> &k) const{
return k.first * 100 + k.second;
}
};
Run Code Online (Sandbox Code Playgroud)
没有运气:
unordered_map<pair<int, int>, int> map = unordered_map<pair<int, int>, int>(1,
*(new pairHash()));
Run Code Online (Sandbox Code Playgroud)
我不知道是什么size_type_Buskets意思所以我给了它1.做正确的方法是什么?谢谢.