2013-10-21 15 views
6

tôi cần phải truy cập vào một số dữ liệu theo ba tiêu chí khác nhau, như thế này:Bản đồ <string1, bản đồ <string2, bản đồ <string3, chuỗi>>> chậm hơn so với ghép chuỗi để ánh xạ <string1string2string3, string>?

my_map["string1"]["string2"]["string3"] 

Bây giờ tôi tự hỏi, nếu nó làm cho tinh thần để nối các chuỗi theo cách này:

my_map["string1|string2|string2"] 

này sẽ tiết kiệm thời gian cho các hoạt động tra cứu? Có các yếu tố quan trọng khác cần cân nhắc không?

+1

Tại sao bạn không thử nghiệm? –

+0

Có người đầu tiên sẽ chậm hơn – P0W

+1

Có đáng không? Cái nào dễ sử dụng nhất? – Aleph

Trả lời

4

Câu hỏi cần được bắt đầu bằng cách xem xét các trường hợp sử dụng bạn cần hỗ trợ. Nếu dữ liệu của bạn có thứ bậc và bạn cần truy cập toàn bộ các phần con của nó (như đi qua số my_map["criteria1"], bạn nên gắn với phiên bản đầu tiên.

Nếu trường hợp đó không xảy ra và bạn chỉ có một bộ dữ liệu lớn Ghép nối các chuỗi không phải là cách tiếp cận tốt nhất vì nó tạo ra một số chi phí nhất định để sao chép và ghép các chuỗi và bạn cần phải cẩn thận về dấu phân tách, có thể yêu cầu bạn thoát khỏi các ký tự nhất định. phức tạp hơn, có nghĩa là: Nhiều lỗi hơn, thay vào đó, bạn muốn lưu trữ ba tiêu chí trong một loại khóa phù hợp, duy nhất: std::tuple.

Bản đồ của bạn có thể giống như (được lưu trữ giá trị của một số loại X):

using my_key_type = std::tuple<std::string,std::string,std::string>; 
std::map< my_key_type, X > my_map; 

giá trị Thêm làm việc như thế này:

my_map.emplace(my_key_type("A", "B", "C"), x); // x is a value of type X 

Và tra cứu có thể được thực hiện một cách hiệu quả với:

X x = my_map[ std::tie("A", "B", "C") ]; 

Như đã chỉ ra bởi David Rodríguez, std::tie không mua hiệu quả cao khi được sử dụng với [], nhưng nó ngắn hơn std::make_shared. Dù sao, bạn sẽ có một lợi ích trong tương lai với C++ 14 khi bạn sử dụng my_map.find(std::tie("A", "B", "C")); mà sẽ cho phép trình biên dịch bỏ qua việc sao chép các chuỗi để tra cứu.

8

Có lẽ không phải là một ý tưởng tốt để làm điều đó vì hai lý do chính:

  • nó làm cho mọi thứ khó hiểu hơn và phức tạp đối với những người đi phía sau bạn
  • trong băng tần tín hiệu mở ra cho bạn tất cả các loại khai thác an ninh thú vị khi ai đó đặt ký tự phân tách vào một trong các chuỗi

Bạn có thể nên tìm cấu trúc dữ liệu làm những gì bạn muốn với thiết kế phù hợp, như tuples.

Các vấn đề liên quan