以下两行代码有何不同之处?
map<int, float> map_data;
map<const int, float> map_data;
以下两行代码有何不同之处?
map<int, float> map_data;
map<const int, float> map_data;
int
和const int
是两种不同的类型。
std::map<int, float>
和std::map<const int, float>
同样是不同的类型。
std::map<const int, float>
和std::map<int, float>
之间的区别,在某种程度上类似于std::map<int, float>
和std::map<std::string,float>
之间的区别;你会得到每个类型的新地图。
在非const
情况下,内部键类型仍然是非const
int
:
std::map<const int, float>::key_type => const int
std::map<int, float>::key_type => int
value_type
)都会将key_type
设置为const
。std::map<const int, float>::value_type => std::pair<const int, float>
std::map<int, float>::value_type => std::pair<const int, float>
因此,如果您的实现允许,那么在所有重要方面,差异可能对您来说基本上是看不见的。
然而,并非总是如此:标准正式要求您的键类型可复制和可移动,并且一些实现重用映射节点;在这些实现中,尝试使用const
键就会失败。
键已经是const
了,在这种情况下写const
是多余的。一旦元素被输入,它的key
就不能被更改。
如评论所述,两行之间确实有不同。例如,如果你编写一个接受map<const int, int>
的函数,你无法将map<int, int>
传递给它,因为它们是不同的类型。
但请注意,虽然它们是不同的类型,但它们的行为相同,因为map中的键已经是const
了......
因此,总之......唯一的区别是它们是两种不同的类型,其他的你不需要关心。
std::map
的接口将键类型公开为“const”,但这并不意味着两个模板实例化与此答案所暗示的相同。 std::map<const int,float>
和 std::map<int,float>
是不同的类型。 - jrokkey_type
实际上仍然是int
。 - Lightness Races in Orbitconst
一旦设定就不能再被改变。根据文档和其他答案,你应该记住 key
已经是一个 const
。
链接: http://www.cplusplus.com/reference/map/map/ 链接: http://en.cppreference.com/w/cpp/container/map
尽管应用程序的行为通常是相同的,但对于您可能使用的某些编译器而言,这确实很重要。以下是我最初来到此页面时引起注意的更具体的示例:
显式指定一个map<const key, value>
会在gnu工具包中成功构建;
然而,在Studio12 Solaris x86版本中会崩溃。
map<key, value>
在两个版本中都可以成功构建。应用程序的行为不变。
std::map::insert
有多个声明。 - blgt如果键是指针,使用常量键可能会很有帮助。当访问这些键时,使用常量键将不允许您修改被指向的对象,可以考虑以下情况:
#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;
}
key_type
为 const int*
时,指针本身不是常量,但所指向的 int
是常量。 - lrineauconst指的是常量,一旦定义后便无法更改...非const键则可能会发生变化...或者根本无法更改,只是在const中“不变”是保证的,而在非const中,“变化”可能发生也可能不发生。