Что такое вектор <int, int> Это вообще допустимо? - PullRequest
0 голосов
/ 11 июля 2019

Я работал с vector < pair < int,int>>, но я не знал, что что-то вроде vector< int,int> также существует, и я могу объявить это, но не знаю, как его использовать.

Является ли vector < int,int> допустимым контейнером, если да, в чем разница и vector < pair < int,int>>?

если нет, то почему я могу объявить это?

Ответы [ 2 ]

5 голосов
/ 11 июля 2019

Что такое vector<int,int>

Второй шаблонный аргумент std::vector - это распределитель, так что это вектор, распределитель которого имеет тип int.

Это даже верно?

Нет.int не удовлетворяет требованиям распределителя.

, если нет, почему я могу объявить его ??

Хорошо, создание шаблона по крайней мере с двумяАргументы шаблона, содержащие не более двух аргументов шаблона, которые не имеют значения по умолчанию, использующего два аргумента типа, корректны.До тех пор, пока вы не попытаетесь использовать распределитель, у вас может возникнуть проблема с правильной формой.

Нет способа выразить на языке, что аргумент шаблона должен удовлетворять определенным свойствам, а стандартная библиотека не 'такого принуждения тоже нет.Функцию Concepts , предложенную для введения в будущий стандарт C ++, можно использовать для обеспечения (некоторых) таких требований, и, возможно, контейнерам также потребуется использовать концепции в будущем.

Если ваш экземпляр шаблона не соответствует требуемой спецификации стандартного контейнера, стандарт не требует, чтобы компилятор диагностировал ошибку.Процитируем последний стандартный черновик:

[res.on.functions]

В некоторых случаях (функции замены, функции-обработчики, операции над типами, используемыми для создания экземпляров стандартных шаблонных компонентов библиотеки),Стандартная библиотека C ++ зависит от компонентов, поставляемых программой C ++. Если эти компоненты не соответствуют их требованиям, этот документ не предъявляет требований к реализации.

В частности, эффекты не определены в следующих случаях:

  • для типов, используемых в качестве аргументов шаблона при создании экземпляра компонента шаблона, если операции над типом не реализуют семантику применимого подпункта Требования ([allocator.requirements], [container.requirements], [iterator.requirements], [алгоритмы].requirements], [numeric.requirements]).Операции над такими типами могут сообщать об ошибке, вызывая исключение, если не указано иное.

Декларация может теоретически компилироваться, поскольку ограничений нет.В моей системе он не компилируется.

3 голосов
/ 11 июля 2019

Ключом здесь является список аргументов шаблона в std::vector

В соответствии с документацией @ https://devdocs.io/cpp/header/vector, std::vector принимает два аргумента шаблона, T (тип вещи дляstore) и Allocator, который является некоторым типом, совпадающим с концепцией Allocator.

template <class T, class Allocator = allocator<T> >
class vector

Распределитель используется для выполнения распределений.Если вы передадите int в качестве распределителя, он не сможет скомпилироваться (и он определенно подходит мне), потому что int не содержит никаких функций, ожидаемых в Allocator.

Ваш первый пример,vector<pair<int, int>> - это вектор, в котором содержащийся объект представляет собой пару целых, а Allocator используется по умолчанию.

...