Добавление к вектору пары

#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);