Продуктивність :
Це залежить.
У вашому конкретному випадку різниці в продуктивності не буде, оскільки вони будуть однаково закладені в пам'яті.
У дуже конкретному випадку (якщо ви використовували порожню структуру як один із членів даних), 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
- структура.