Tôi có một đối tượng bản đồ std :: map<string , Property*> _propertyMap
, trong đó string
là tên của thuộc tính và Property*
chứa các giá trị thuộc tính.std :: bản đồ nhận giá trị - tìm vs vòng lặp thủ công
tôi cần phải xử lý các giá trị tài sản và chuyển đổi chúng sang một dữ liệu cụ thể format- mỗi tài sản có định dạng riêng của mình, ví dụ như nếu khởi tạo bản đồ là như sau:.
_propertyMap["id"] = new Property(Property::UUID, "12345678");
_propertyMap["name"] = new Property(Property::STRING, "name");
....
sau đó "id"
nên được xử lý khác nhau hơn "name"
, v.v.
Điều này có nghĩa là tôi cần tìm mỗi thuộc tính trong bản đồ và xử lý các giá trị của nó cho phù hợp.
Tôi đã nghĩ về hai cách để thực hiện điều đó.
One, sử dụng std::map::find
phương pháp để có được một tài sản cụ thể, như thế:
map<string , Property*>::iterator it1 = _propertyMap.find("id");
if(it1 != _propertyMap.end())
{
//element found - process id values
}
map<string , Property*>::iterator it2 = _propertyMap.find("name");
if(it2 != _propertyMap.end())
{
//element found - process name values
}
....
Hai, lặp bản đồ và cho mỗi mục kiểm tra những gì tên của bất động sản là gì và tiến hành cho phù hợp:
for (it = _propertyMap.begin(); it != _propertyMap.end(); ++it)
{
//if it is events - append the values to the matching nodes
if (it->first == "id")
{
//process id values
}
else if (it->first == "name")
{
//process name values
}
.....
}
Cho rằng Time complexity of std::map::find is O(logN), độ phức tạp của giải pháp đầu tiên là O(NlogN)
. Tôi không chắc chắn về sự phức tạp của giải pháp thứ hai, bởi vì nó lặp lại bản đồ một lần (O(N)
), nhưng thực hiện rất nhiều if-else
mỗi lần lặp lại. Tôi đã cố gắng để google phổ biến map::find()
câu hỏi, nhưng không thể tìm thấy bất kỳ thông tin hữu ích; hầu hết trong số họ chỉ cần lấy một giá trị từ bản đồ và sau đó find()
thực hiện điều này với độ phức tạp cao hơn (O(logN) vs O(N)
).
Phương pháp tiếp cận tốt hơn là gì? hoặc có lẽ có một cái khác mà tôi không nghĩ đến?
Ngoài ra, nói kiểu mã, mã nào tốt hơn và rõ ràng hơn?
Có vẻ lạ và không rõ ràng (đối với tôi). Ví dụ: trong '_propertyMap [" id "]' chỉ nên là một phần tử hoặc đây có phải là danh sách hoặc vectơ không? Hơn bạn sẽ viết N else nếu hoặc tìm thấy tuyên bố? Nếu tôi nhớ chính xác cho lý thuyết phức tạp thì chỉ có sự so sánh mới được tính. Đó sẽ là N * N cho giải pháp thứ hai của bạn " –
Bản đồ chứa các thuộc tính, mỗi thuộc tính có một khóa (' chuỗi') và giá trị (đối tượng thuộc loại 'Thuộc tính *'). Trong ví dụ, '_propertyMap [" id "]' là một mục có chứa khóa "id" và giá trị 'new Property (Property :: UUID," 12345678 ")' và cứ thế cho mỗi mục nhập bản đồ. Sau đó, tôi muốn xử lý dữ liệu vì vậy tôi cần phải tìm một mục cụ thể, mà tôi không biết cách tìm; bằng cách sử dụng 'find' hoặc một vòng lặp. – user3114639
@ hr_11, Đây là câu hỏi của tôi; là cái thứ hai thực sự là O (N * N)? bởi vì không phải tất cả 'if-else' sẽ đạt tới mỗi lần lặp lại, vì vậy có lẽ nó là O (NlogN). Ngoài ra tôi không chắc chắn là một mã tốt hơn và rõ ràng hơn. – user3114639