Tôi có một std::unordered_map
với một value_type mà không có một constructor mặc định vì vậy tôi không thể làm như sauthực hiện đặt vào một chỗ là tồi tệ hơn séc tiếp theo đặt vào một chỗ
auto k = get_key();
auto& v = my_map[k];
tôi đã kết thúc viết một hàm helper
value_type& get_value(key_type& key)
{
return std::get<0>(my_map.emplace(
std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(args_to_construct_value)
))->second;
}
nhưng hiệu suất kém hơn rõ rệt (tức là hàm tạo của value_type xuất hiện trong trạng thái hoàn hảo) so với phiên bản sau.
value_type& get_value(key_type& key)
{
auto it = my_map.find(key);
if (it == my_map.end())
return std::get<0>(my_map.emplace(
std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(args_to_construct_value)
))->second;
else
return it->second;
}
Tôi đọc từ std::unordered_map::emplace object creation mà emplace cần xây dựng đối tượng để xem có tồn tại không. Nhưng emplace đang kiểm tra xem liệu cặp giá trị khóa này tồn tại trong bản đồ trước khi nó trả về.
Tôi có đang sử dụng địa điểm không đúng cách không? Có một mô hình tốt hơn tôi nên làm theo rằng:
- Sẽ không xây dựng value_type tôi mỗi tra cứu (như trong phương pháp đầu tiên của tôi)
- Sẽ không làm việc kiểm tra cho thấy nếu value_type tồn tại trong bản đồ của tôi hai lần (như trong phương pháp thứ hai của tôi)
Cảm ơn
Tại sao bạn không sử dụng phương pháp thứ hai với [emplace_hint] (http://en.cppreference.com/w/cpp/container/unordered_map/emplace_hint)? – nosid
@ nosid: Bởi vì điều đó đòi hỏi bạn phải có một gợi ý, mà anh ta không có. Tất cả những gì anh ta có là một biến lặp 'end' –
Thực ra, hãy nghĩ về nó, tôi không có ý tưởng về sương mù nơi người ta có thể nhận được một gợi ý cho một bản đồ _unordered_. Tôi biết bạn có thể sử dụng 'lower_bound' cho một bản đồ, nhưng tôi không chắc liệu nó có hoạt động không theo thứ tự hay không. –