我可以構造密鑰類型是引用類型(例如,引用類型)的std::map
。 Foo &
如果不是,爲什麼不呢?可以使用引用類型作爲STL映射中的密鑰類型
回答
根據C++標準23.1.2/7 key_type
應該是可賦值的。引用類型不是。
不,因爲std :: map中的許多函數需要對keytype的引用,並且對引用的引用在C++中是非法的。
/A.B。
考慮operator[](const key_type & key)
。 如果key_type
是Foo &
那麼什麼是const key_type &
? 事情是它不起作用。你不能構造一個std :: map,其中鍵類型是引用類型。
指針作爲關鍵類型的std ::地圖是完全合法的
#include <iostream>
#include <cstdlib>
#include <map>
using namespace std;
int main()
{
int a = 2;
int b = 3;
int * c = &a;
int * d = &b;
map<int *, int> M;
M[c]=356;
M[d]=78;
return 0;
}
初始化引用是不能忽視的關鍵:
#include <iostream>
#include <cstdlib>
#include <map>
using namespace std;
int main()
{
int a = 2;
int b = 3;
int & c = a;
int & d = b;
map<int &, int> M;
M[c]=356;
M[d]=78;
return 0;
}
In file included from /usr/include/c++/4.4/map:60,
from test.cpp:3:
/usr/include/c++/4.4/bits/stl_tree.h: In instantiation of 'std::_Rb_tree<int&, std::pair<int&, int>, std::_Select1st<std::pair<int&, int> >, std::less<int&>, std::allocator<std::pair<int&, int> > >':
/usr/include/c++/4.4/bits/stl_map.h:128: instantiated from 'std::map<int&, int, std::less<int&>, std::allocator<std::pair<int&, int> > >'
test.cpp:14: instantiated from here
/usr/include/c++/4.4/bits/stl_tree.h:1407: error: forming pointer to reference type 'int&
'
請記住,基於指針的排序是非確定性的,並可能隨程序的每次調用而改變。 – 2009-11-25 15:16:40
更不用說比較鍵是否相等,因此這是比較查找時的指針地址值,而不是指針值的比較。具體來說,在這個例子中,如果有另外一個int e = 2,並且你查找了M [&e],你就不會得到你認爲你正在尋找的東西。 – mmocny 2010-10-23 05:29:53
- 1. 使用類類型作爲映射key_value
- 2. 使用映射將COM VARIANT類型映射到實際類型
- 3. 使用嵌套類型從類型到類型的AutoMapper映射
- 4. STL爲相同的用戶定義類型設置和映射
- 5. AutoMapper可以在值類型(枚舉)和引用類型之間映射嗎? (串)
- 6. SWIG類型映射爲指針的STL地圖一類
- 7. 作爲第二種類型的自定義類的C++ STL映射
- 8. 在Typescript中使用Enum作爲受限密鑰類型
- 9. JNI - 映射UChar類型爲
- 10. 序列化不同的密鑰類型映射到JSON
- 11. 使用的.jar類型映射文件
- 12. 我可以使用JPA將對象類型映射到表嗎?
- 13. 覆蓋使用類型映射()
- 14. 使用NHibernate映射XML數據類型
- 15. 類型錯誤:使用替換映射
- 16. 使用NHibernate映射泛型類
- 17. 使用AutoMapper映射未知類型
- 18. 是可空類型的引用類型?
- 19. 使用泛型映射接口類型到類
- 20. Hiberate映射類型和保存類型
- 21. 將Oracle類型映射到Hibernate類型
- 22. Automapper:錯誤映射類型。映射類型:IEnumerable`1 - > IEnumerable`1
- 23. 使用類類型作爲Java中的密鑰DSL有效負載類型路由器
- 24. AutoMapper類型轉換器映射可空類型不可空類型
- 25. 如何將類類型用作映射鍵和類的值列表作爲映射值?
- 26. 地圖的密鑰類型
- 27. ehcache的密鑰類型
- 28. 爲什麼使用枚舉來映射hibernate中的類型表?
- 29. AutoMapper - 如何映射到嵌套類型的值 - 可以爲null?
- 30. 如何引用java映射中的類型的對象?
+1這是一個很好的問題是很多人都不敢問。 – laura 2009-11-25 10:52:46
不是直接的,但'boost :: reference_wrapper'應該可以工作。它有一個隱式轉換爲'Foo&' –
MSalters
2009-11-26 10:11:06