В чем разница в распределении памяти и эффективности между использованием структуры с двумя полями и парой?В чем разница между использованием структуры с двумя полями и парой?
ответ
std::pair
содержит предварительно написанные конструкторы и операторы сравнения. Это также позволяет хранить их в контейнерах, таких как std :: map, без необходимости писать, например, конструктор копирования или строгий слабый порядок через operator <
(например, требуется std::map
). Если вы их не пишете, вы не можете ошибаться (помните, как работает строгий слабый порядок?), Поэтому более надежно использовать std::pair
.
С точки зрения распределения памяти и эффективности, нет никакой разницы - так как это именно то, что такое std::pair
.
Вот что отвечает на то, о чем мне было интересно, я вдруг понял, что эффективность действительно зависит от того, что вы сделали бы, это слишком много информации. Я собираюсь принять решение AshleysBrain для дальнейшего размышления ... –
Нет проблем, но было бы разумнее спросить о сравнении простоты использования, если это то, что вас интересует. Навеен и я оба ответили на вопрос как указано. (Не жалуюсь, просто говорю ...) –
Хм, похоже, сделал серьезную опечатку в моем комментарии. «Это тот ответ, о котором мне было интересно», должно быть. Я дал AshleysBrain принятый ответ, поскольку он был быстрым и дал хороший ответ, как и вы. Трудно было выбирать, но я пошел за тем, кто больше всего выиграет. –
Никакой разницы в распределении или эффективности памяти. Фактически, в реализации STL я использую пару, которая определена как struct pair
Какая реализация STL вы используете? –
Я использую тот, который поставляется с компилятором VC9. – Naveen
Да, это придерживается общепринятого соглашения о том, что если пользовательский тип предоставляет публичным элементам данных (например, 'pair' делает с' first' и 'second'), то он должен быть' struct'. – Manuel
std::pair
предлагает множество конструкторов и операторов.
A struct
Разрешить именованные поля (кроме first
и second
) и готовы к продлению в любое время.
Предпочитаете struct
, когда это возможно, это может быть связано с некоторыми накладными расходами, но определенно проще в обслуживании.
+1 для комментария обслуживания. Я работал с группой инженеров из Нью-Джерси, которые пытались сделать все (и я имею в виду все) с STL, и вместо того, чтобы создавать соответствующие классы/структуры при указании дизайна, они использовали контейнер STL. Код был усеян "if (route.first.second [* iter] .first) {...}". Тьфу! –
Хорошая идея, будет помнить об этом позже. –
Как указано в std::pair<int, int> vs struct with two int's, структура, вероятно, будет немного быстрее, потому что не выполняется инициализация.
Я не думаю, что std :: pair предоставляет любые конструкторы или операторы для своих членов. О чем именно вы думаете? – Manuel
@Manuel, на самом деле я только что проверил и уверен, 'pair' предоставляет по умолчанию ctor и копию шаблона ctor. Имеет смысл - таким образом, в каждом случае 'pair' позволяет вызывать его, если & только, если это позволяют базовые типы. –
Да, но OP, казалось, подразумевал, что std :: pair * magically * сгенерировал эти элементы для базовых типов. Странно, что этот ответ был принят. – Manuel