如何从const ref中获取键的值?

时间:2018-05-03 06:46:07

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

为什么我无法获取键的值,在我传入函数的const ref unordered_map中,但我可以使用本地unordered_map?

GameObject(const std::unordered_map<int,std::unordered_map<int,int>>& objectParameters){
        if (objectParameters.find(CAPABILITY_TYPE_SPECIE)!=objectParameters.end()) {

 //Following line gives an error:
    auto map2 = objectParameters[CAPABILITY_TYPE_SPECIE];         

//Following line works just fine
            std::unordered_map<int,std::unordered_map<int,int>> objectParameters2;
            auto map = objectParameters2[CAPABILITY_TYPE_SPECIE];

        }

为什么我无法从objectParameters中获取值? 编译器抱怨的错误是:

  

类型'const没有可行的重载operator []   std :: unordered_map&gt;'

编辑:从类型中删除“const”似乎使错误消失。这是为什么 ?

2 个答案:

答案 0 :(得分:3)

operator[]是一个非const成员函数,不能通过const引用调用对象。它不能是const成员,因为如果键不在地图中,则指定插入项。事实上你甚至不需要使用它。

您使用find()然后只丢弃结果,为什么?如果该项存在,它将获取该项的迭代器。所以不要丢弃它,使用它。

auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
     auto map2 = item->second;

虽然如果您希望map2map1中的auto map2相同,但上述内容也不会这样做。由于item->secondmap1的副本。要修改map2中的项目,我们需要将auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE); if (item != objectParameters.end()) { auto& map2 = item->second; 作为参考:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
             'http://quotes.toscrape.com/page/2/',
         ]
        for url in urls:
             request = scrapy.Request(url=url, callback=self.parse)
             request.meta['proxy'] = "http://username:password@some_proxy_server:port"
             yield request

    def parse(self, response):
         pass

关于你的编辑,删除const来“修复”这样的错误是不对的。 Const正确性很重要,当你进行这样的“修复”时,它可能会在代码中引入细微的错误。因为现在不应该改变的事情可能会意外地发生变化。

答案 1 :(得分:2)

  

为什么我无法从objectParameters中获取值?

因为当使用operator []访问map元素并且键不存在时,它将被创建。如果map是const,显然编译器不能这样做。

您可以尝试使用.at()因为const重载http://en.cppreference.com/w/cpp/container/map/at