map迭代器,读取字符串的错误

时间:2017-06-22 04:32:31

标签: c++ c++11 iterator unordered-map

我正在尝试在带有前缀的地图中进行部分匹配。

我的keys类似于:"ABCD efg,1234"

我的values类似于:"qqwe,123123,asdad,2000,323232"

认为我传递的字符串与密钥匹配是"ABCD efg"

  NOTE: the `map` deceleration is elsewhere. It is declered like the following: 
       std::unordered_map<std::string, std::string> umap;

 Code:

std::unordered_map<std::string, std::string>::const_iterator Account::FindPrefix(const std::string& search_for)
{
    std::unordered_map<std::string, std::string>::const_iterator got = umap.lower_bound(search_for);

    if (got != umap.end())
    {
        const std::string& key = got->first;
        if (key.compare(0, search_for.size(), search_for) == 0)
            return got;
    }
    return umap.end();
}

代码已编译,但始终返回umap.end(),并且从未返回got,因此我使用了调试器,我注意到constant iterator got的值为(<Error reading characters of string>,<Error reading characters of string>)

注意:我确实检查过以确保我正确地将值输入map,似乎没问题,因为我可以看到它被填充。

注2:Kabanus建议在if语句之前输出got。当它达到std::cout<<got->first;程序崩溃时,我得到以下按摩:

Exception thrown at 0x57EF65F6 (msvcp140d.dll) in BankManagment.exe: 0xC0000005: Access violation reading location 0xCDCDCDCD.

编辑: 我不知道为什么编译器没有捕获使用low_bound与无序映射 enter image description here

编辑: 以下是对decltype的错误按摩(在帖子的评论中要求) enter image description here

1 个答案:

答案 0 :(得分:0)

您想使用find方法:http://www.cplusplus.com/reference/unordered_map/unordered_map/find/

如果它是std::map,则下限将标记项目本身(如果已经存在)或者可以添加它的位置(“插入提示”)。它有利于高效的搜索或插入操作(您不需要再次遍历树)。你只是模仿find已经做过的事情,在这里(也就是说,如果你再次std::map)......