Это будет довольно простой вопрос: в C ++ 03 я бы хранил два значения одного типа с std::pair
, Однако необходимость повторять тип дважды — это как-то беспокоит, когда я хочу, чтобы оба моих значения были одного типа. Теперь, с C ++ 11, мы имеем std::array
, Было бы более идиоматичным написать это:
std::array<int, 2> foo;
…вместо этого:
std::pair<int, int> foo;
…когда цель состоит в том, чтобы сохранить две взаимосвязанные данные (например, изображение результата функции, решающей квадратное уравнение)?
pair<T, T>
является определенно неправильно
make_pair(1, 2) == make_pair(2, 1)
должно быть правда если они представляют корни многочлена!
По той же причине массив / вектор также не будет работать, если вы не измените поведение сравнения.
Так что я бы сказал сделать bag<T, N>
тип данных, который представляет multiset<T>
с фиксированным размером, вроде как array<T, N>
представляет vector<T>
с фиксированным размером.
Поскольку размер маленький, вы можете просто делать все с помощью грубой силы (сравнение, проверка на равенство и т. Д.).
Я бы по-прежнему использовал пару, чтобы указать, что одно значение связано с другим. Array не передает это значение мне.
std::pair
имеет смысл, если у вас есть связь между двумя предметами, и вы хотите описать это отношение.
Тем не менее, в вашем случае я бы использовал std::array
, поскольку два решения квадратного уравнения не имеют никакой связи друг с другом (я вижу связь между решениями и уравнением, но не между двумя решениями).
Зависит от более широкого контекста.
В приведенном вами примере я бы пошел с std::array
, потому что тогда вы также можете шаблонизировать функцию по степени уравнения:
template <int N>
std::array<double, N> solveEquation(const Polynomial<N>& poly);
Я бы сказал, что соответствующая C ++ 11 абстракция std::pair<>
является std::tuple<>
, поскольку пара — это особый случай кортежа.
std::pair<>
не обязательно имеет одинаковые типы, кстати.
Именно по идиоматическим причинам я бы предложил использовать pair
а обозначает, что оба значения связаны между array
больше относится к списку ценностей (по моему скромному мнению).
Например, в предложенном вами использовании отношение между обоими значениями будет самой квадратичной функцией.