C++ CPP使用不存在的密钥访问地图

C++ CPP使用不存在的密钥访问地图,c++,C++,在此函数中,整数和整数的向量表示为“nums”和“target” 我尝试创建一个哈希表,其中一个键作为目标nums[I],一个值作为该键的# 例如,如果nums=[3,3,4,5],target=7 key -> value | 4 -> 2 | 3 -> 1 | 2 -> 1 函数的代码是 vector<int> twoSum(vector<int>& nums, int target)

在此函数中,整数和整数的向量表示为“nums”和“target”

我尝试创建一个哈希表,其中一个键作为目标nums[I],一个值作为该键的#

例如,
如果nums=[3,3,4,5],target=7

 key -> value

   |  4  ->   2

   |  3  ->   1

   |  2  ->   1
函数的代码是

vector<int> twoSum(vector<int>& nums, int target) {
    int first=0;
    int second=0;
    map<int, int> HT;
    vector<int> sol;

    for(vector<int>::iterator i=nums.begin(); i<nums.end();i++){
        if(HT[target-*i]==NULL)
            HT.insert(pair<int, int>(target - *i, 1));
        else
            HT[target-*i]++;

    }
}
在for循环下,if条件
HT[target-*i]==NULL
似乎从来都不是真的

我认为在CPP中,如果我访问一个不存在的键,它会立即初始化为NULL值

如果是这样,则无论何时看到新密钥,该条件都必须为真

哪一部分我错了

if(HT[target-*i]==NULL)

这是胡说八道。这将始终添加一个新密钥。用计数代替

if(HT.count(target-*i)==0)

或者


如果(HT.find(target-*i)=HT.end())
一个函数在应该返回的时候没有返回值(即
twoSum
函数),将导致未定义的行为。所以任何事情都可能发生()

编译器通常会对此发出警告,但您可以使用
-Werror=return type
编译器标志将其升级为错误

有关更多信息,请参阅本文:

中,如果(HT[target-*i]==NULL)
std::map
[]
操作符未找到请求的键,则会自动插入该键。您的映射包含int值,而不是指针,因此将它们与NULL进行比较是错误的

检测映射中是否存在给定键的正确方法是使用
map::find()
方法及其返回的迭代器,例如

map-HT;
矢量溶胶;
对于(向量::迭代器i=nums.begin();i!=nums.end();++i){
迭代器find=HT.find(target-*i);
if(found==HT.end())
HT.插入(形成配对(目标-*i,1));
其他的
找到->第二个++;
}
//根据需要填充并返回sol。。。
但是,不需要手动搜索和插入密钥。让地图自动为您插入新的关键点会更容易。自动插入值的默认值为0,当您对新插入的值调用
++
运算符时,该值将增加到1,例如:

map-HT;
矢量溶胶;
对于(向量::迭代器i=nums.begin();i!=nums.end();++i){
HT[target-*i]++;
}
//根据需要填充并返回sol。。。
如果您使用的是C++11或更高版本,请使用基于范围的for循环来简化循环:

map-HT;
矢量溶胶;
for(int i:nums){
HT[target-i]++;
}
//根据需要填充并返回sol。。。

您是说else部分正在生成消息吗?如果我用[1,2,3]这样的向量测试它,其中没有值重叠,因此HT[target-*I]始终是一个新键,它仍然会生成相同的错误message@parktomatomi但是OP正在插入
HT
,这是一张地图。向量
sol
从未被触摸过。@SacrificerXY是的,完全误读了它。将删除我的评论以避免混淆。建议:您可以使用一个我测试过的代码简化for循环,它不会崩溃/出错谢谢!这就是我要找的
==31==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000060 at pc 0x0000004193d5 bp 0x7ffe5e3cd950 sp 0x7ffe5e3cd948
READ of size 4 at 0x602000000060 thread T0
    #2 0x7f66b38802e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)"