В чем разница между использованием структуры с двумя полями и парой?

В чем разница в распределении памяти и эффективности между использованием структуры с двумя полями и парой?


person Tamara Wijsman    schedule 10.02.2010    source источник


Ответы (6)


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

person AshleysBrain    schedule 10.02.2010
comment
Я не думаю, что std::pair предоставляет какие-либо конструкторы или операторы для своих членов. О чем именно вы думаете? - person Manuel; 10.02.2010
comment
@ Мануэль, на самом деле я только что проверил и, конечно же, pair предоставляет ctor по умолчанию и ctor копии шаблона. Имеет смысл - таким образом, в каждом случае pair позволяет вызывать его тогда и только тогда, когда это разрешено базовыми типами. - person j_random_hacker; 10.02.2010
comment
Да, но OP, похоже, подразумевает, что std::pair волшебным образом генерирует эти члены для базовых типов. Странно, что этот ответ был принят. - person Manuel; 10.02.2010
comment
Формулировка могла бы быть немного лучше, но я думаю, что AshleysBrain знает, о чем говорит. - person sellibitze; 10.02.2010
comment
Отредактировано, чтобы попытаться уточнить формулировку. - person AshleysBrain; 10.02.2010
comment
Я думаю, что это требует упоминания std::make_pair(), что довольно удобно во многих случаях, особенно в связи с новым значением auto. - person sbi; 18.12.2012
comment
Делает ли тот факт, что у std::pair есть конструктор, она немного медленнее, чем структура без конструктора? если мы добавим миллионы элементов, например, в std::map? - person Basj; 30.07.2017

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

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

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

person Matthieu M.    schedule 11.02.2010
comment
+1 за комментарий по обслуживанию. Я работал с группой инженеров из Нью-Джерси, которые пытались делать все (я имею в виду все) с помощью STL, и вместо того, чтобы создавать соответствующие классы/структуры, как того требовал дизайн, они использовали контейнер STL. Код был завален if (route.first.second[*iter].first) { ... }. Фу! - person Don Wakefield; 11.02.2010

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

person j_random_hacker    schedule 10.02.2010
comment
Вот что отвечает на то, о чем я думал, я вдруг понял, что эффективность действительно зависит от того, что вы будете делать, поэтому информации слишком много. Я собираюсь принять вопрос AshleysBrain для дальнейшего размышления... - person Tamara Wijsman; 10.02.2010
comment
Нет проблем, но было бы разумнее спросить о сравнении простоты использования, если это то, что вас интересует. Навин и я оба ответили на вопрос, как указано. (Не жалуюсь, просто говорю...) - person j_random_hacker; 10.02.2010
comment
Хм, кажется, я сделал серьезную опечатку в своем комментарии. Это ответ, который, как мне было интересно, должен был быть. Я дал AshleysBrain принятый ответ, так как он был быстр и дал хороший ответ, как и вы. Выбрать было сложно, но я выбрал того, кто больше всего выиграет. - person Tamara Wijsman; 13.02.2010
comment
Есть ли исходный файл/заголовок, показывающий, что пара закодирована внутри как структура? - person Basj; 30.07.2017
comment
@Basj: у меня нет под рукой стандарта С++ 09, но я считаю, что стандарт требует этого. - person j_random_hacker; 30.07.2017
comment
@j_random_hacker: Если вы найдете стандарт C++09, дайте мне знать ;) - person Lightness Races in Orbit; 01.05.2018
comment
@LightnessRacesinOrbit: Упс, очевидно, это должен был быть C++11. - person j_random_hacker; 01.05.2018

Поскольку это не упомянуто выше, если вам нужны преимущества вашего собственного имени, но преимущества std::pair (или любых других объектов), вы можете использовать «using» (начиная с С++ 11). Вы можете установить это в своем пространстве имен или объявлении класса.

На самом деле, так начинаются многие мои занятия...

using myPair = pair<int,string>;

ср. справочник по C++. для получения дополнительной документации.

person Konchog    schedule 01.05.2018

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

person Naveen    schedule 10.02.2010
comment
Какую реализацию STL вы используете? - person Benoît; 10.02.2010
comment
Я использую тот, который поставляется с компилятором VC9. - person Naveen; 10.02.2010
comment
Да, это соответствует общему соглашению, согласно которому, если определяемый пользователем тип предоставляет общедоступные элементы данных (например, pair делает с first и second), то он должен быть struct. - person Manuel; 10.02.2010
comment
Может быть class с first и second, объявленными в разделе public. В соответствии с интерфейсом члены first и second должны быть открытыми; не указывает, должно ли это быть class или struct. - person Thomas Matthews; 10.02.2010
comment
@Thomas Matthews: между struct X { ... }; и class X { public: ... }; нет никакой семантической разницы. (Например, в отличие от C#.) - person j_random_hacker; 11.02.2010
comment
Кажется, это противоречит ответу Баша. - person Keith M; 07.02.2019

Как указано в std::pair‹int, int› vs struct с двумя int структура, вероятно, будет немного быстрее, потому что инициализация не производится.

person Basj    schedule 30.07.2017