Продуктивність :
Це залежить.
У вашому конкретному випадку різниці в продуктивності не буде, оскільки вони будуть однаково закладені в пам'яті.
У дуже конкретному випадку (якщо ви використовували порожню структуру як один із членів даних), std::pair<>потенційно потенційно можна використовувати оптимізацію порожньої бази (EBO) та мати менший розмір, ніж структурний еквівалент. А менший розмір, як правило, означає більш високу продуктивність:
struct Empty {};
struct Thing { std::string name; Empty e; };
int main() {
std::cout << sizeof(std::string) << "\n";
std::cout << sizeof(std::tuple<std::string, Empty>) << "\n";
std::cout << sizeof(std::pair<std::string, Empty>) << "\n";
std::cout << sizeof(Thing) << "\n";
}
Принти: 32, 32, 40, 40 на ideone .
Примітка. Мені невідома жодна реалізація, яка фактично використовує трюк EBO для звичайних пар, проте, як правило, він використовується для кортежів.
Читання :
Однак, крім мікрооптимізацій, названа структура є більш ергономічною.
Я маю на увазі, map[k].firstчи не так вже й погано, але get<0>(map[k])ледве можна зрозуміти. Контраст, з map[k].nameяким одразу вказується те, з чого ми читаємо.
Тим важливіше, коли типи можуть бути конвертовані один в одного, оскільки їх обміняння ненавмисно стає справжнім клопотом.
Ви також можете прочитати про "Структурне проти номінального набору тексту". Enteце специфічний тип, яким можуть керувати лише ті речі, які очікують Ente, все, що може діяти, std::pair<std::string, bool>може діяти на них ... навіть коли те, що вони очікують, std::stringабо boolне містить його, оскільки std::pairне має з ним пов'язаної семантики .
Технічне обслуговування :
Щодо технічного обслуговування, pairце найгірше. Ви не можете додати поле.
tupleярмарки краще в цьому плані, доки ви додасте нове поле, всі існуючі поля все ще мають доступ до того ж індексу. Що настільки ж непереборно, як раніше, але принаймні вам не потрібно їх переглядати та оновлювати.
struct- явний переможець. Ви можете додавати поля де завгодно.
На закінчення:
pair є найгіршим з обох світів,
tuple може мати незначний край у дуже конкретному випадку (порожній тип),
- використання
struct .
Примітка: якщо ви користуєтеся геттерами, ви можете самостійно використовувати порожню базову хитрість, без того, щоб клієнти знали про це як у struct Thing: Empty { std::string name; }; саме тому інкапсуляція - це наступна тема, якою слід займатися.
std::pair- структура.