将 unordered_maps 作为指针访问

Posted

技术标签:

【中文标题】将 unordered_maps 作为指针访问【英文标题】:accessing unordered_maps as pointers 【发布时间】:2016-04-03 22:01:17 【问题描述】:

由于某种原因,我无法在我的 unordered_map 中编辑值,并且想知道我做错了什么。

在下面的代码中,parameter是一个结构体。由于某种原因,以下代码抛出了语法错误,不喜欢 [.

void MyClass::setParameter(string name, parameter param) 
    if (this->param_name_to_data == nullptr) 
        //create it lazily
        this->param_name_to_data = new unordered_map<string, parameter>();
    
    this->param_name_to_data->[name] = param;

对应的.h文件中声明的字典id为:

private:
 std::unordered_map<std::string, parameter> * param_name_to_data = nullptr;

我做错了什么?

【问题讨论】:

动态分配unordered_map有什么原因吗? 我可能会切换到静态分配。 【参考方案1】:

param_name_to_data-&gt;[name] = param; 不是有效语法

当编译器看到-&gt; 时,它会查找成员变量或成员函数。声明 -&gt;[...] 毫无意义,因为单独的 [] 既不是成员变量也不是函数。

你可以改写

(*param_name_to_data)[name] = param;

或先将指针转为引用

auto& map = *param_name_to_data;
map[name] = param;

你也可以使用丑陋的字面形式

param_name_to_data->operator[] (name) = param

但最后一个不鼓励。

【讨论】:

我以为我以前在代码中的某处看到过 ->[],这就是我尝试使用它的原因。有什么被禁止的原因吗? 谢谢。我仍然觉得奇怪的是它无法智能地搜索任何其他运算符的缩写。这没什么大不了的,我只是好奇是否有一些与语法树歧义相关的原因或编译器无法执行该步骤的原因。 基本上是这样,因为标准没有说明-&gt;[] 是从指针调用operator [] 的有效语法。所以没有编译器实现它。如果标准明确说明它应该是有效的,那就是正确的 @user650261: "* 我仍然觉得奇怪的是它无法智能地搜索任何其他运算符的缩写。*" 那是因为它不是“缩写”。 operator[] 是函数的名称。 -&gt; 运算符在语法上旨在后跟 operator-&gt; 返回的类型的成员名称。 [] 不是成员名,所以失败了。

以上是关于将 unordered_maps 作为指针访问的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用指针存储/访问大对象以避免内存不足

自定义 unordered_map 的哈希函数

仅使用带有键的 unordered_map 来存储指针(忽略值)

如何在 C++ 中单独锁定 unordered_map 元素

unordered_map 迭代器迭代到空指针,无视可能性

std::unordered_map 的函数指针