#c #vector #std-pair
#c #вектор #std-pair
Вопрос:
У меня есть vector
pair
такой:
vector<pair<string,double>> revenue;
Я хочу добавить строку и двойную из такой карты:
revenue[i].first = "string";
revenue[i].second = map[i].second;
Но поскольку доход не инициализирован, он выдает ошибку out of bounds. Итак, я попытался использовать vector::push_back
так:
revenue.push_back("string",map[i].second);
Но это говорит о том, что не может принимать два аргумента. Итак, как я могу добавить к этому vector
of pair
?
Комментарии:
1. Итак, у вас есть не пара векторов, а вектор пар или вектор пар. Как только вы это поймете, вы решили свою проблему.
Ответ №1:
Используйте std::make_pair
:
revenue.push_back(std::make_pair("string",map[i].second));
Комментарии:
1. Как насчет emplace_back?
2. @Mr.WorshipMe, вы можете использовать его в C 11. Смотрите Ответ ниже для примера. Хотя я не уверен, о чем вы спрашиваете.
3. Я указывал на более элегантное и, возможно, более быстрое решение… Я не видел недооцененного ответа ниже… Возможно, вы захотите обновить свой ответ…
4. Будет ли этот подход отличаться в конструкторе? (например. У меня есть класс, содержащий вектор пар, и я хочу прочитать из двумерного initializer_list . Где предполагается, что внутренним является пара. Итак, я зацикливаюсь и
vec.push_back(make_pair ...)
люблю это)
Ответ №2:
ИМХО, очень хорошим решением является использование c 11 emplace_back функции:
revenue.emplace_back("string", map[i].second);
Это просто создает новый элемент на месте.
Ответ №3:
revenue.pushback("string",map[i].second);
Но это говорит о том, что не может принимать два аргумента. Итак, как я могу добавить к этой векторной паре?
Вы на правильном пути, но подумайте об этом; что содержит ваш вектор? Он, конечно, не содержит string и int в одной позиции, он содержит Pair
. So …
revenue.push_back( std::make_pair( "string", map[i].second ) );
Ответ №4:
Или вы можете использовать инициализировать список:
revenue.push_back({"string", map[i].second});
Ответ №5:
Прочитайте следующую документацию:
http://cplusplus.com/reference/std/utility/make_pair/
или
http://en.cppreference.com/w/cpp/utility/pair/make_pair
Я думаю, это поможет. Эти сайты являются хорошими ресурсами для C , хотя последний, по-видимому, является предпочтительной ссылкой в наши дни.
Ответ №6:
revenue.push_back(pair<string,double> ("String",map[i].second));
это будет работать.
Ответ №7:
Вы можете использовать std::make_pair
revenue.push_back(std::make_pair("string",map[i].second));
Ответ №8:
Использование emplace_back
function намного лучше, чем любой другой метод, поскольку он создает объект вместо типа T
where vector<T>
, тогда push_back
как ожидает от вас фактического значения.
vector<pair<string,double>> revenue;
// make_pair function constructs a pair objects which is expected by push_back
revenue.push_back(make_pair("cash", 12.32));
// emplace_back passes the arguments to the constructor
// function and gets the constructed object to the referenced space
revenue.emplace_back("cash", 12.32);
Ответ №9:
Как многие предлагали, вы могли бы использовать std::make_pair
.
Но я хотел бы указать на другой способ сделать то же самое:
revenue.push_back({"string",map[i].second});
push_back() принимает один параметр, поэтому вы можете использовать «{}» для достижения этой цели!
Ответ №10:
Попробуйте использовать другую временную пару:
pair<string,double> temp;
vector<pair<string,double>> revenue;
// Inside the loop
temp.first = "string";
temp.second = map[i].second;
revenue.push_back(temp);