C++ 使用C++;11读/写模式中的无序映射

C++ 使用C++;11读/写模式中的无序映射,c++,c++11,std,unordered-map,C++,C++11,Std,Unordered Map,在我程序的一部分中,我想更新无序映射的给定值。问题可以简化如下: #include <iostream> #include <stdlib.h> #include <unordered_map> #include <string> int main(int argc, char **argv) { std::unordered_map <unsigned long, int> map; unsigned long i =

在我程序的一部分中,我想更新
无序映射的给定值。问题可以简化如下:

#include <iostream>
#include <stdlib.h>
#include <unordered_map>
#include <string>
int main(int argc, char **argv) {
    std::unordered_map <unsigned long, int> map;
    unsigned long i = 1;
    std::string s;
    while (i != 0) {
        std::cout << "Give me an unsigned long" << std::endl;
        std::cin >> s;
        i = strtoul(s.c_str(), NULL, 0);
        if (map.find(i) == map.end()) map[i] = 1;
        else if (map[i] < static_cast<unsigned long>(-1)) map[i] += 1;
    }
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
std::无序地图;
无符号长i=1;
std::字符串s;
而(i!=0){
std::cout s;
i=strtoul(s.c_str(),NULL,0);
如果(map.find(i)=map.end())map[i]=1;
else如果(map[i]
(当然,我的程序不存储用户输入数据,只是为了说明。我的程序实际上在4个字母的字母表上存储整数编码字符串。我需要散列,而不是树。)

如您所见,我需要检查是否存在密钥,并对其进行更新。由于我存储了超过10亿个整数,我想知道最有效的方法

我看到了,但它没有提到价值更新

非常感谢大家。

int&value=map[key];
int &value = map[key];
if (value != static_cast<unsigned long>(-1)) ++value;
如果(值!=static_cast(-1))++值;
如果映射中不存在
将被初始化为
0
,因此将在增量后取
1
的正确值。

int&value=map[key];
如果(值!=static_cast(-1))++值;

如果地图中不存在
将被初始化为
0
,因此在递增后将取
1
的正确值。

简单而优雅!然而,有两件事我不知道:初始化为0,以及对映射值的引用(尽管我应该知道)。简单而优雅!但是,有两件事我不知道:初始化为0,以及映射中对值的引用(尽管我应该知道)。请注意,在转换中,您可能希望使用
std::numeric\u limits::max()
@phresnel:非常正确。我仍然不太熟悉C++11的限制。然而,它会计算
map[i]
,然后得到它的类型(我不想要的东西),还是等效于
std::numeric\u limits::max()
?请注意,在转换中,您可能希望使用
std::numeric\u limits::max()
@phresnel:Very true。我仍然不太熟悉C++11的限制。然而,它会计算
map[i]
,然后得到它的类型(我不想要的),还是等效于
std::numeric\u limits::max()