C++ 为什么我在std::map上使用运算符[]无效?
假设我有一个类型为C++ 为什么我在std::map上使用运算符[]无效?,c++,C++,假设我有一个类型为 std::map<int, Node> G; 如果某个节点在映射中,我想使用操作符[]返回该节点的引用;如果不在映射中,则创建一个新节点并返回引用。这就是我对文件内容的理解: 如果k与容器中元素的键匹配,则函数返回对其映射值的引用 如果k与容器中任何元素的键不匹配,则函数将插入一个具有该键的新元素,并返回对其映射值的引用。请注意,这始终会将容器大小增加1,即使没有为元素指定映射值(元素是使用其默认构造函数构造的) 但是,以下代码会抛出一个错误(g++5,std=
std::map<int, Node> G;
如果某个节点在映射中,我想使用操作符[]返回该节点的引用;如果不在映射中,则创建一个新节点并返回引用。这就是我对文件内容的理解:
如果k与容器中元素的键匹配,则函数返回对其映射值的引用
如果k与容器中任何元素的键不匹配,则函数将插入一个具有该键的新元素,并返回对其映射值的引用。请注意,这始终会将容器大小增加1,即使没有为元素指定映射值(元素是使用其默认构造函数构造的)
但是,以下代码会抛出一个错误(g++5,std=gnu++11):
错误:无法将赋值u_ptr=G[3]中的'std::map::mapped_type{aka Node}'转换为'Node*'
在我看到的所有示例中,G[k]
出现在lhs上。G[k]
是否不允许在rhs上使用?如果没有,原因是什么?std::map::operator[]
返回一个T&
引用
在这种情况下,T
是节点
,因此G[3]
返回一个节点&
引用,然后您尝试将其分配给节点*
指针。这就是为什么会出现编译器错误
因此,您可以:
u_ptr
更改为参考:
Node& u_ptr = G[3];
和地址运算符将引用转换为指针:
Node* u_ptr;
u_ptr = &G[3];
std::map::operator[]
返回一个T&
引用
在这种情况下,T
是节点
,因此G[3]
返回一个节点&
引用,然后您尝试将其分配给节点*
指针。这就是为什么会出现编译器错误
因此,您可以:
u_ptr
更改为参考:
Node& u_ptr = G[3];
和地址运算符将引用转换为指针:
Node* u_ptr;
u_ptr = &G[3];
在你的教科书中查找指针。你正在分配一个指向
节点
的指针,但地图包含节点
s。这与节点a没有区别;节点*b=a你是说u_ptr=&G[3]代码>我一直在阅读“引用”作为“指针”的同义词S谢谢。请在您的教材中查找指针。您正在指定指向节点
的指针,但地图包含节点
S。这与节点a没有区别;节点*b=a你是说u_ptr=&G[3]代码>我一直在阅读“引用”作为“指针”的同义词也值得一提的是auto&u_ptr=G[3]代码>啊,非常愚蠢的错误。。。我一直把“引用”理解为“指针”的同义词。@RJTK:在编译的机器代码中,引用和指针通常会生成相同的代码。但在语义上,它们在语言中被视为不同的类型代码>啊,非常愚蠢的错误。。。我一直把“引用”理解为“指针”的同义词。@RJTK:在编译的机器代码中,引用和指针通常会生成相同的代码。但在语义上,它们在语言中被视为不同的类型。