
Многим программистам знакомы концепции пар и кортежей (pair и tuple) — их реализации есть в STL, Boost (и может быть где-нибудь еще). Для тех, кто не знает, что это такое, я коротко поясню — это шаблоны, позволяющие сгруппировать несколько значений (пара — только 2, tuple — много) с целью хранить\передавать\принимать их вместе.
Пример из MSDN:
pair <int, double> p1 ( 10, 1.1e-2 );
pair <int, double> p2 = make_pair ( 10, 2.22e-1 );
cout << "The pair p1 is: ( " << p1.first << ", " << p1.second << " )." << endl;
cout << "The pair p2 is: ( " << p2.first << ", " << p2.second << " )." << endl;
Поначалу идея кажется заманчивой, ведь:
- Вместо передачи в функцию нескольких векторов одинаковой размерости можно передать только один вектор пар\кортежей, не заботясь о проверке их соответствия.
- Можно легко вернуть из функции набор значений, не мороча голову с указателями или ссылками в out-параметрах (для многих это сложно)
- Можно избежать создания кучи мелких структур из 2-3 полей (меньше кода — лучше).
Но есть и тёмная сторона этой силы.