首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >常量密钥和非常量密钥有什么区别?

常量密钥和非常量密钥有什么区别?
EN

Stack Overflow用户
提问于 2013-07-14 17:29:25
回答 4查看 11.9K关注 0票数 81

下面两行之间的区别是什么?

代码语言:javascript
复制
map<int, float> map_data;
map<const int, float> map_data;
EN

回答 4

Stack Overflow用户

发布于 2013-07-14 23:52:19

不同之处在于,第二个变体会将映射的键类型设置为const int。从“可修改性”的角度来看,这是多余的,因为映射已经将其键存储为const对象。

但是,这也可能导致这两个映射的行为出现意想不到且不明显的差异。在C++中,为类型T编写的模板专门化与为类型const T编写的专门化不同。这意味着上述两个版本的映射最终可能会使用依赖于键类型的各种“附属”模板的不同专门化。关键比较器谓词就是一个例子。第一个将使用std::less<int>,而第二个将使用std::less<const int>。通过利用这种差异,您可以轻松地使这些映射以不同的顺序对其元素进行排序。

在像std::unordered_map这样的新C++11容器中,这样的问题更加明显。std::unordered_map<const int, int>甚至不会编译,因为它将尝试使用std::hash<const int>专门化来对键进行散列。这种专门化在标准库中不存在。

票数 9
EN

Stack Overflow用户

发布于 2013-07-14 17:40:45

const一旦设置就不能更改。是的,根据文档和其他答案,您应该记住key已经是const了。

链接:http://www.cplusplus.com/reference/map/map/链接:http://en.cppreference.com/w/cpp/container/map

票数 3
EN

Stack Overflow用户

发布于 2014-02-17 00:38:47

如果键是指针,常量键可能会很有用。使用常量键不允许您在访问键时修改指向的对象,请考虑以下内容:

代码语言:javascript
复制
#include <map>
#include <string>

int glob = 10;

int main() {
    std::map<const int*, std::string> constKeyMap { { &glob, "foo"} };
    std::map<int*, std::string> keyMap { { &glob, "bar" } };

    for(const auto& kv : keyMap) { *(kv.first) = 20; }; // glob = 20
    for(const auto& kv : constKeyMap) { *(kv.first) = 20; }; // COMPILE ERROR

    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17638154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档