Tôi muốn lưu trữ một giá trị dấu chấm động cho một cặp số nguyên không theo thứ tự. Tôi không thể tìm thấy bất kỳ loại hướng dẫn dễ hiểu nào cho việc này. Ví dụ: đối với cặp không có thứ tự {i,j}
Tôi muốn lưu trữ một giá trị dấu phẩy động f
. Làm cách nào để chèn, lưu trữ và truy xuất các giá trị như thế này?C++ lưu trữ một giá trị trong một cặp không có thứ tự
Trả lời
Dưới đây là một số mã chỉ thị:
#include <iostream>
#include <unordered_map>
#include <utility>
struct Hasher
{
int operator()(const std::pair<int, int>& p) const
{
return p.first^(p.second << 7)^(p.second >> 3);
}
};
int main()
{
std::unordered_map<std::pair<int,int>, float, Hasher> m =
{ { {1,3}, 2.3 },
{ {2,3}, 4.234 },
{ {3,5}, -2 },
};
// do a lookup
std::cout << m[std::make_pair(2,3)] << '\n';
// add more data
m[std::make_pair(65,73)] = 1.23;
// output everything (unordered)
for (auto& x : m)
std::cout << x.first.first << ',' << x.first.second
<< ' ' << x.second << '\n';
}
Lưu ý rằng nó dựa trên quy ước mà bạn lưu trữ các cặp có thứ tự với số lượng thấp đầu tiên (nếu họ không bình đẳng). Bạn có thể thấy thuận tiện khi viết một hàm hỗ trợ nhận một cặp và trả về theo thứ tự đó, vì vậy bạn có thể sử dụng hàm đó khi chèn các giá trị mới trong bản đồ và khi sử dụng cặp làm khóa để tìm giá trị trong bản đồ.
Output:
4.234
3,5 -2
1,3 2.3
65,73 1.23
2,3 4.234
Xem nó trên ideone.com. Nếu bạn muốn thực hiện hàm băm tốt hơn, chỉ cần tìm hiểu cách thực hiện hash_combine
(hoặc sử dụng tăng) - nhiều câu hỏi ở đây về SO giải thích cách thực hiện điều đó cho std::pair<>
s.
Bạn triển khai loại UPair với các yêu cầu và tình trạng quá tải ::std::hash
(đây là dịp hiếm hoi mà bạn được phép thực hiện điều gì đó trong std
).
#include <utility>
#include <unordered_map>
template <typename T>
class UPair {
private:
::std::pair<T,T> p;
public:
UPair(T a, T b) : p(::std::min(a,b),::std::max(a,b)) {
}
UPair(::std::pair<T,T> pair) : p(::std::min(pair.first,pair.second),::std::max(pair.first,pair.second)) {
}
friend bool operator==(UPair const& a, UPair const& b) {
return a.p == b.p;
}
operator ::std::pair<T,T>() const {
return p;
}
};
namespace std {
template <typename T>
struct hash<UPair<T>> {
::std::size_t operator()(UPair<T> const& up) const {
return ::std::hash<::std::size_t>()(
::std::hash<T>()(::std::pair<T,T>(up).first)
)^
::std::hash<T>()(::std::pair<T,T>(up).second);
// the double hash is there to avoid the likely scenario of having the same value in .first and .second, resulinting in always 0
// that would be a problem for the unordered_map's performance
}
};
}
int main() {
::std::unordered_map<UPair<int>,float> um;
um[UPair<int>(3,7)] = 3.14;
um[UPair<int>(8,7)] = 2.71;
return 10*um[::std::make_pair(7,3)]; // correctly returns 31
}
Cách đơn giản để xử lý có thứ tự cặp int được sử dụng để tạo ra std::minmax(i,j)
std::pair<int,int>
. Bằng cách này bạn có thể thực hiện lưu trữ của bạn như thế này:
std::map<std::pair<int,int>,float> storage;
storage[std::minmax(i,j)] = 0.f;
storage[std::minmax(j,i)] = 1.f; //rewrites storage[(i,j)]
băm Phải thừa nhận rằng thích hợp sẽ cung cấp cho bạn một số hiệu năng cao hơn, nhưng có rất ít tác hại trong hoãn loại tối ưu hóa.
- 1. Lưu các cặp giá trị khóa trùng lặp trong C#
- 2. Lưu trữ nhiều giá trị trong một khóa trong json
- 3. Tìm giá trị hiện có trong cặp Giá trị chính
- 4. cặp giá trị chính trong C# Params
- 5. Swap hai/cặp giá trị quan trọng trong một mảng
- 6. Có cặp giá trị tên chung nào trong java không?
- 7. Microsoft có thể lưu trữ ba trường có giá trị trong một bit không?
- 8. cách tự động lưu trữ giá trị của một lá cờ đơn giản vào một biến?
- 9. Giá trị được lưu trữ trong C++ ở đâu?
- 10. Bộ sưu tập cặp khóa/giá trị chung trong đó giữ lại thứ tự chèn?
- 11. cách viết một bộ cho cặp không có thứ tự trong Java
- 12. Cấu trúc dữ liệu bản đồ trong pl/sql để lưu trữ cặp giá trị khóa?
- 13. MySQL: có thể một AUTO_INCREMENT tạo ra các giá trị không theo thứ tự?
- 14. Bộ sưu tập java có cặp khóa/giá trị và được sắp xếp theo thứ tự chèn
- 15. thứ tự một QuerySet bằng giá trị trường tổng hợp
- 16. Lưu trữ một từ điển với các giá trị đa hình trong mongoDB sử dụng C#
- 17. Có thể lưu trữ một giá trị trong một cấu trúc thông qua một đặc điểm không?
- 18. Vẽ một dict python theo thứ tự giá trị chính
- 19. Lưu trữ một mảng float C trong một NSDictionary
- 20. Lưu trữ giá trị Boolean trong SQL?
- 21. Lưu trữ nhiều giá trị trong cookie
- 22. TSQL, đếm cặp giá trị trong một bảng
- 23. giá trị Thứ tự trong SQL
- 24. lưu trữ một giá trị mảng chính thành một chuỗi JSON compact
- 25. Tạo một cookie sử dụng jquery để lưu trữ các cặp tên/giá trị của thông tin
- 26. SQLite Chọn giá trị DISTINCT của một cột không có thứ tự
- 27. Thứ tự khóa/giá trị Jersey JSON
- 28. lưu trữ giá trị âm trong mysql
- 29. Tôi có thể dựa vào thứ tự của một bản đồ không có thứ tự không?
- 30. COUNT() hoạt động mỗi lần, hoặc lưu trữ giá trị và tăng giá trị một lần?
bạn cần chuyên 'std :: hash' cho loại bạn muốn sử dụng làm khóa và bạn cũng cần xác định' toán tử == 'trên đó. Và đó là nó. –
@TheParamagneticCroissant Bạn có thể đăng câu trả lời không? Tôi chưa bao giờ làm việc với băm, vv, vì vậy hãy giữ nó đơn giản nhất có thể. Cảm ơn bạn. – AvZ
đã có câu trả lời chuẩn về chuyên 'std :: hash' cho loại khóa tùy chỉnh của bạn [ở đây] (https://stackoverflow.com/questions/8157937/how-to-specialize-stdhashkeyoperator-for-user-defined-type -in-không có thứ tự). –