2010-02-10 1 views

ответ

18

std::pair содержит предварительно написанные конструкторы и операторы сравнения. Это также позволяет хранить их в контейнерах, таких как std :: map, без необходимости писать, например, конструктор копирования или строгий слабый порядок через operator < (например, требуется std::map). Если вы их не пишете, вы не можете ошибаться (помните, как работает строгий слабый порядок?), Поэтому более надежно использовать std::pair.

+1

Я не думаю, что std :: pair предоставляет любые конструкторы или операторы для своих членов. О чем именно вы думаете? – Manuel

+1

@Manuel, на самом деле я только что проверил и уверен, 'pair' предоставляет по умолчанию ctor и копию шаблона ctor. Имеет смысл - таким образом, в каждом случае 'pair' позволяет вызывать его, если & только, если это позволяют базовые типы. –

+1

Да, но OP, казалось, подразумевал, что std :: pair * magically * сгенерировал эти элементы для базовых типов. Странно, что этот ответ был принят. – Manuel

5

С точки зрения распределения памяти и эффективности, нет никакой разницы - так как это именно то, что такое std::pair.

+0

Вот что отвечает на то, о чем мне было интересно, я вдруг понял, что эффективность действительно зависит от того, что вы сделали бы, это слишком много информации. Я собираюсь принять решение AshleysBrain для дальнейшего размышления ... –

+2

Нет проблем, но было бы разумнее спросить о сравнении простоты использования, если это то, что вас интересует. Навеен и я оба ответили на вопрос как указано. (Не жалуюсь, просто говорю ...) –

+0

Хм, похоже, сделал серьезную опечатку в моем комментарии. «Это тот ответ, о котором мне было интересно», должно быть. Я дал AshleysBrain принятый ответ, поскольку он был быстрым и дал хороший ответ, как и вы. Трудно было выбирать, но я пошел за тем, кто больше всего выиграет. –

1

Никакой разницы в распределении или эффективности памяти. Фактически, в реализации STL я использую пару, которая определена как struct pair

+0

Какая реализация STL вы используете? –

+0

Я использую тот, который поставляется с компилятором VC9. – Naveen

+1

Да, это придерживается общепринятого соглашения о том, что если пользовательский тип предоставляет публичным элементам данных (например, 'pair' делает с' first' и 'second'), то он должен быть' struct'. – Manuel

15

std::pair предлагает множество конструкторов и операторов.

A struct Разрешить именованные поля (кроме first и second) и готовы к продлению в любое время.

Предпочитаете struct, когда это возможно, это может быть связано с некоторыми накладными расходами, но определенно проще в обслуживании.

+11

+1 для комментария обслуживания. Я работал с группой инженеров из Нью-Джерси, которые пытались сделать все (и я имею в виду все) с STL, и вместо того, чтобы создавать соответствующие классы/структуры при указании дизайна, они использовали контейнер STL. Код был усеян "if (route.first.second [* iter] .first) {...}". Тьфу! –

+0

Хорошая идея, будет помнить об этом позже. –

 Смежные вопросы

  • Нет связанных вопросов^_^