Có sự khác biệt giữa an std::pair
và an std::tuple
chỉ có hai thành viên không? (Bên cạnh điều hiển nhiên là std::pair
yêu cầu hai và chỉ hai thành viên và tuple
có thể có nhiều hơn hoặc ít hơn ...)
Câu trả lời:
Có một số khác biệt:
std::tuple
không bao giờ có thể theo bố cục tiêu chuẩn (ít nhất, nó không bắt buộc phải theo tiêu chuẩn). Mọi std::pair<T, Y>
là bố cục tiêu chuẩn nếu cả hai T
và Y
đều là bố cục tiêu chuẩn.
Nó dễ dàng hơn một chút để lấy nội dung của a pair
hơn a tuple
. Bạn phải sử dụng một lời gọi hàm trong tuple
trường hợp, trong khi pair
trường hợp chỉ là một trường thành viên.
Nhưng đó là về nó.
std::map
sử dụng std::pair<const Key,T>
như là value_type
chẵn trong C ++ 11. Chính xác thì các bộ giá trị được sử dụng ở std::map
đâu?
std::map
.
Đây là một câu trả lời rất muộn nhưng lưu ý rằng, vì std::pair
được định nghĩa với các biến thành viên, kích thước của nó không thể được tối ưu hóa bằng cách sử dụng tối ưu hóa lớp cơ sở trống ( first
và second
phải chiếm các địa chỉ riêng biệt, ngay cả khi một hoặc cả hai là một lớp trống). Điều này càng trở nên trầm trọng hơn bởi bất kỳ yêu cầu căn chỉnh second_type
nào, vì vậy trong trường hợp xấu nhất, kết quả std::pair
về cơ bản sẽ gấp đôi kích thước mà nó cần.
std::tuple
chỉ cho phép truy cập thông qua các chức năng trợ giúp, vì vậy nó có thể bắt nguồn từ một trong hai loại nếu một hoặc loại kia trống, tiết kiệm chi phí. Việc triển khai của GCC, ít nhất, chắc chắn làm được điều này ... bạn có thể xem qua các tiêu đề để xác minh điều này nhưng cũng có đây là bằng chứng.
[[no_unique_address]]
nên loại bỏ std::pair
nhược điểm của.
std::tuple
Tên của An dài hơn (thêm một ký tự). Nhiều ký tự trong số đó được nhập bằng tay phải, vì vậy hầu hết mọi người đều dễ dàng nhập hơn.
Điều đó nói rằng, std::pair
chỉ có thể có hai giá trị - không phải 0, một, ba hoặc nhiều hơn. HAI giá trị. Tuy nhiên, một tuple hầu như không có giới hạn ngữ nghĩa về số lượng giá trị. std::pair
Do đó, An là kiểu an toàn, chính xác hơn để sử dụng nếu bạn thực sự muốn chỉ định một cặp giá trị.
std::tuple<>
là kiểu an toàn (làm sao mà không được?), Và không khác về mặt ngữ nghĩa . 2
pair
Đối với những gì nó đáng giá, tôi thấy đầu ra GDB của std :: tuple khó đọc hơn nhiều. Rõ ràng nếu bạn cần nhiều hơn 2 giá trị thì std :: pair sẽ không hoạt động, nhưng tôi coi đây là một điểm có lợi cho cấu trúc.
std::get<0>(tupleName)
trong một getter; GetX()
dễ đọc hơn và ngắn hơn rất nhiều. Nó có một nhược điểm nhỏ là nếu bạn quên làm cho nó một const
phương pháp ai đó có thể làm điều gì đó ngu ngốc như thế này: GetX() = 20;
.
.first
và.second
tiện dụng, nhưng họ không giúp gì nếu (các) thành viên thứ ba (hoặc nhiều hơn) được yêu cầu thay đổi mã. Tôi nhận thấy rằng tôi có xu hướng sử dụngstd::get
bất kể trong bất kỳ Getters nào theo cách đó tôi không cần thay đổi mọi thứ, chỉ là các kiểu dữ liệu và bất kỳmake_pair
lệnh gọi nàomake_tuple
.