我想初始化一个std::map.现在我正在使用,::insert但我觉得我浪费了一些计算时间,因为我已经知道我想要分配的大小.有没有办法分配固定大小的地图,然后填写地图?
我正在使用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)增长.
我们知道基于哈希表的容器实现就像std::unordered_map使用了很多内存但我不知道多少是多少?
除了空间复杂性表示法,并且不考虑容器元素是否是指向更大对象的指针:
有没有办法弄清楚这样的容器在运行时使用了多少字节?
有没有办法在运行时告诉任何容器使用多少内存?
根据stackoverflow和cppreference中描述的迭代器失效规则,我知道除非发生重新哈希,否则迭代器不会对 unordered_map 失效。
如果我使用 std::vector 类比,那么这是否意味着所有插入也发生在迭代器当前指向的位置之前?
我正在修改正在迭代的 unordered_map ,并希望确保不会因迭代器失效而导致任何中断。我至少确保避免使用保留关键字unordered_map Reserve重新哈希
这是我正在编写的示例代码:
// Function to return vector containing the subvector of inputVector with sum desiredSum, this function returns empty vector if sum not found
std::vector<int> sumVectorFunc(const std::vector<int>& inputVector, const int desiredSum){
std::unordered_map< int,std::vector<int> > sumToSubVector{};
sumToSubVector.reserve(desiredSum+1);
// initialization with the zero sum
sumToSubVector[0] = std::vector<int>{};
for(auto itVector : inputVector){ // iterate over the vector of elements
std::unordered_set<int> numbersAddedThisCycle{};
for(auto itSubVectors : sumToSubVector){ // iterate …Run Code Online (Sandbox Code Playgroud)