Производительность :
Это зависит.
В вашем конкретном случае не будет никакой разницы в производительности, потому что эти два будут аналогично размещены в памяти.
В очень конкретном случае (если вы использовали пустую структуру в качестве одного из элементов данных), она std::pair<>может потенциально использовать Оптимизацию пустой базы (EBO) и иметь меньший размер, чем эквивалент структуры. А меньший размер обычно означает более высокую производительность:
struct Empty {};
struct Thing { std::string name; Empty e; };
int main() {
std::cout << sizeof(std::string) << "\n";
std::cout << sizeof(std::tuple<std::string, Empty>) << "\n";
std::cout << sizeof(std::pair<std::string, Empty>) << "\n";
std::cout << sizeof(Thing) << "\n";
}
Отпечатки: 32, 32, 40, 40 на ideone .
Примечание. Мне неизвестно о какой-либо реализации, которая на самом деле использует трюк EBO для обычных пар, однако обычно он используется для кортежей.
Читаемость :
Однако, кроме микрооптимизации, именованная структура более эргономична.
Я имею в виду, map[k].firstэто не так уж плохо, пока get<0>(map[k])едва понятно. Контраст с map[k].nameкоторым сразу указывает на то, с чего мы читаем.
Это тем более важно, когда типы могут быть преобразованы друг в друга, поскольку их случайная замена становится реальной проблемой.
Вы могли бы также хотеть прочитать о Структурном против Номинального Печатания. Enteэто определенный тип, который может работать только с теми вещами, которые ожидают Ente, все, с чем он может работать, std::pair<std::string, bool>может воздействовать на них ... даже когда std::stringили boolне содержит того, что они ожидают, потому что std::pairс ним не связано никакой семантики .
Техническое обслуживание :
С точки зрения обслуживания, pairэто худшее. Вы не можете добавить поле.
tupleВ этом отношении лучше, если вы добавите новое поле, все существующие поля будут по-прежнему доступны по одному и тому же индексу. Что так же непостижимо, как и раньше, но, по крайней мере, вам не нужно идти и обновлять их.
structявный победитель. Вы можете добавлять поля везде, где хотите.
В заключение:
pair худший из обоих миров,
tuple может иметь небольшое преимущество в очень специфическом случае (пустой тип),
- использовать
struct .
Примечание: если вы используете геттеры, то вы можете использовать пустую базовую уловку самостоятельно, чтобы клиенты не знали об этом, как в struct Thing: Empty { std::string name; }; вот почему инкапсуляция - это следующая тема, о которой вам следует задуматься.
std::pairЭто на структуру.