Идиоматический способ хранения двух связанных значений одного типа

Это будет довольно простой вопрос: в C ++ 03 я бы хранил два значения одного типа с std::pair, Однако необходимость повторять тип дважды — это как-то беспокоит, когда я хочу, чтобы оба моих значения были одного типа. Теперь, с C ++ 11, мы имеем std::array, Было бы более идиоматичным написать это:

std::array<int, 2> foo;

…вместо этого:

std::pair<int, int> foo;

…когда цель состоит в том, чтобы сохранить две взаимосвязанные данные (например, изображение результата функции, решающей квадратное уравнение)?

0

Решение

Я не думаю, что есть какой-либо тип данных, подходящий для этого ни в стандартной библиотеке, ни в Boost.

pair<T, T> является определенно неправильно
make_pair(1, 2) == make_pair(2, 1) должно быть правда если они представляют корни многочлена!

По той же причине массив / вектор также не будет работать, если вы не измените поведение сравнения.

Так что я бы сказал сделать bag<T, N> тип данных, который представляет multiset<T> с фиксированным размером, вроде как array<T, N> представляет vector<T> с фиксированным размером.

Поскольку размер маленький, вы можете просто делать все с помощью грубой силы (сравнение, проверка на равенство и т. Д.).

4

Другие решения

Я бы по-прежнему использовал пару, чтобы указать, что одно значение связано с другим. Array не передает это значение мне.

1

std::pair имеет смысл, если у вас есть связь между двумя предметами, и вы хотите описать это отношение.

Тем не менее, в вашем случае я бы использовал std::array, поскольку два решения квадратного уравнения не имеют никакой связи друг с другом (я вижу связь между решениями и уравнением, но не между двумя решениями).

0

Зависит от более широкого контекста.

В приведенном вами примере я бы пошел с std::array, потому что тогда вы также можете шаблонизировать функцию по степени уравнения:

template <int N>
std::array<double, N> solveEquation(const Polynomial<N>& poly);
0

Я бы сказал, что соответствующая C ++ 11 абстракция std::pair<> является std::tuple<>, поскольку пара — это особый случай кортежа.

std::pair<> не обязательно имеет одинаковые типы, кстати.

0

Именно по идиоматическим причинам я бы предложил использовать pair а обозначает, что оба значения связаны между array больше относится к списку ценностей (по моему скромному мнению).

Например, в предложенном вами использовании отношение между обоими значениями будет самой квадратичной функцией.

0
По вопросам рекламы [email protected]