下面两行之间的区别是什么?
map<int, float> map_data;
map<const int, float> map_data;
发布于 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>
专门化来对键进行散列。这种专门化在标准库中不存在。
发布于 2013-07-14 17:40:45
const
一旦设置就不能更改。是的,根据文档和其他答案,您应该记住key
已经是const
了。
链接:http://www.cplusplus.com/reference/map/map/链接:http://en.cppreference.com/w/cpp/container/map
发布于 2014-02-17 00:38:47
如果键是指针,常量键可能会很有用。使用常量键不允许您在访问键时修改指向的对象,请考虑以下内容:
#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;
}
https://stackoverflow.com/questions/17638154
复制相似问题