Tôi có thể tạo std::map
trong đó loại khóa là loại tham chiếu không, ví dụ: Foo &
và nếu không, tại sao không?Loại tham chiếu có thể được sử dụng làm loại khóa trong bản đồ STL
Trả lời
Theo C++ Standard 23.1.2/7 key_type
nên được gán. Loại tham chiếu không.
Không, vì nhiều hàm trong std :: map lấy tham chiếu đến keytype và tham chiếu đến tham chiếu là bất hợp pháp trong C++.
/A.B.
Xem xét operator[](const key_type & key)
. Nếu key_type
là Foo &
thì const key_type &
là gì? Vấn đề là nó không hoạt động. Bạn không thể xây dựng một std :: map nơi kiểu khóa là một kiểu tham chiếu.
Pointer như một loại chìa khóa cho std :: bản đồ là hoàn toàn hợp pháp
#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;
}
tài liệu tham khảo được khởi tạo không thể được phím:
#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&
'
Hãy nhớ rằng thứ tự dựa trên con trỏ là không xác định và có khả năng thay đổi với mỗi yêu cầu của chương trình. –
Chưa kể rằng các phím được so sánh cho bình đẳng, và vì vậy đây là so sánh các giá trị địa chỉ con trỏ khi thực hiện tra cứu, và không so sánh giá trị con trỏ tới. Cụ thể, trong ví dụ này nếu có một int e = 2 khác, và bạn tra cứu M [& e], bạn sẽ không nhận được những gì bạn có thể nghĩ rằng bạn đang tìm kiếm. – mmocny
- 1. Sử dụng tham chiếu làm loại mẫu
- 2. Các loại tham chiếu có thể loại bỏ không?
- 3. Tại sao tôi không thể lưu trữ các tham chiếu trong bản đồ STL trong C++?
- 4. Có thể tạo chu trình tham chiếu chỉ sử dụng các loại giá trị không?
- 5. Sử dụng kiểu dữ liệu (loại lớp) làm khóa trong bản đồ
- 6. Tại sao tôi không thể sử dụng loại tham chiếu làm loại giá trị của loại vùng chứa?
- 7. Các loại tham chiếu không thể null
- 8. Loại tùy chỉnh làm khóa cho bản đồ - C++
- 9. Loại có thể là loại tham chiếu và loại giá trị cùng một lúc không?
- 10. Guid có được coi là loại giá trị hoặc loại tham chiếu không?
- 11. Không thể sử dụng bản đồ stl với struct?
- 12. Bản đồ STL trên bản thân?
- 13. đối tượng loại tham chiếu loại giá trị trong javascript
- 14. C++ const std :: tham chiếu bản đồ không biên dịch
- 15. Cách lấy loại tham chiếu?
- 16. Loại tham chiếu - chúng tôi có thể xem tham chiếu thực tế không?
- 17. Các loại được chấp nhận để sử dụng làm khóa trong HashTable
- 18. Không thể sử dụng các loại tĩnh làm tham số
- 19. Loại tham chiếu không thể tìm thấy loại công khai có tên
- 20. Hãy tiểu thể loại Wordpress sử dụng loại Template
- 21. Chuyển đổi loại C# theo tham chiếu thành loại không khớp theo tham chiếu
- 22. bản đồ vectơ trong STL?
- 23. Sử dụng Delphi, không thể sử dụng loại anonymus làm loại bản ghi?
- 24. hiệu suất bản đồ stl?
- 25. Hợp nhất hai bản đồ STL
- 26. "Sử dụng lại loại hiện có" bị bỏ qua khi thêm tham chiếu dịch vụ
- 27. Nhận loại sử dụng phản chiếu
- 28. Loại 'System.Object' được định nghĩa trong một assembly không được tham chiếu - Ứng dụng Windows Store
- 29. Lỗi loại tham chiếu chung Monotouch
- 30. Từ khóa sử dụng trong đóng cửa PHP có được tham chiếu không?
1 đây là một câu hỏi hay mà nhiều người ngại hỏi. – laura
Không trực tiếp, nhưng 'boost :: reference_wrapper' sẽ hoạt động. Nó có một chuyển đổi tiềm ẩn để 'Foo &' –
MSalters