为什么我无法获取键的值,在我传入函数的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”似乎使错误消失。这是为什么 ?
答案 0 :(得分:3)
operator[]
是一个非const成员函数,不能通过const引用调用对象。它不能是const成员,因为如果键不在地图中,则指定插入项。事实上你甚至不需要使用它。
您使用find()
然后只丢弃结果,为什么?如果该项存在,它将获取该项的迭代器。所以不要丢弃它,使用它。
auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
auto map2 = item->second;
虽然如果您希望map2
与map1
中的auto map2
相同,但上述内容也不会这样做。由于item->second
是map1
的副本。要修改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