#c #data-structures #std-pair
Вопрос:
Я получаю проблему в строках 15 и 20, где я пытаюсь вернуть элементы в вектор пары
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
int main()
{
int x, y, a, b, c, d, j, m, v;
vector<pair<int, int> > ladder;
cin >> x >> y;
for (int i = 0; i < x; i ) {
cin >> a >> b;
ladder.push_back(pair(a, b));
}
vector<pair<int, int> > snake;
for (int i = 0; i < y; i ) {
cin >> c >> d;
snake.push_back(pair(c, d));
}
vector<int> moves;
cin >> v;
while (v != 0) {
moves.push_back(v);
v = 0;
cin >> v;
}
return 0;
}
Мои ошибки:
prog.cpp: In function ‘int main()’:
prog.cpp:15:30: error: missing template arguments before ‘(’ token
ladder.push_back(pair(a, b));
^
prog.cpp:20:29: error: missing template arguments before ‘(’ token
snake.push_back(pair(c, d));
У меня есть код для тестирования:
https://ideone.com/ZPKP4s
Комментарии:
1. Строка 15
vector<int> moves;
и строка 20cin >> v;
— если я считаю правильно — лучше поместите комментарий за соответствующие строки и, пожалуйста, опубликуйте точное сообщение об ошибке в виде текста.2. Кроме того, какой компилятор вы используете и какие параметры командной строки вы используете, в частности, какой языковой стандарт (CTAD является новым для C 17).
3. Используйте компилятор C 17.
4. @RaymondChen Я использую c 14, так что, возможно, это может быть проблемой. Но я исправил проблему, используя метод scohoe001s в комментарии. Возможно, более старая версия нуждается в указании, тогда как более новые версии этого не делают
5. C 14 требует, чтобы вы указали тип. C 17 добавляет функцию CTAD, которая позволяет ее опустить. C 14 имеет упрощенный механизм построения пар :
ladder.push_back(std::make_pair(a, b))
. Или вы можете использоватьladder.emplace_back(a, b)
и разрешитьemplace
создание пары.
Ответ №1:
Вычет параметров шаблона для std::pair
не работает до C 17.
Вам нужно явно указать параметры шаблона, std::pair<int,int>(a, b)
, или полностью обойти это и создать pair
на месте, используя vector
emplace_back
функцию-член, которая пересылает заданные аргументы pair<int,int>
конструктору в vector
«как есть»:
ladder.emplace_back(a, b);
// ...
snake.emplace_back(c, d);
Вот ваш код, использующий emplace_back
вместо этого.
Ответ №2:
Ваша проблема в этих двух строках:
ladder.push_back(pair(a, b));
ladder.push_back(pair(c, d));
Вам нужно указать, какие типы пар это:
ladder.push_back(pair<int, int>(a, b));
ladder.push_back(pair<int, int>(c, d));
Комментарии:
1. Поскольку это создает
pair<int, int>
сa
помощью иb
, а затем помещает его в вектор, было бы даже лучше просто использоватьladder.emplace_back(a, b)
здесь. Смотрите также en.cppreference.com/w/cpp/container/vector/emplace_back2. это сработало, спасибо!!
Ответ №3:
ladder.push_back(pair(a, b));
Вы должны передать аргумент шаблона класса std::pair
ladder.push_back(pair<int, int>(a, b));