Вставить вектор для значения в карте в С++
Я застрял в попытке выяснить, как вставить вектор для значения на карте. Например:
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
map <int, vector<int> > mymap;
mymap.insert(pair<int, vector<int> > (10, #put something here#));
return 0;
}
Я не знаю, какой синтаксис использовать для вставки вектора для значения. Я попробовал {1,2}
, но это не удалось. Какой синтаксис я должен использовать?
Все работает, если я объявляю вектор заранее и даю ему имя, но я не хочу этого делать, поскольку хочу иметь карту с большим количеством векторов.
Благодарим вас в Advance
Ответы
Ответ 1
В основном ваш вопрос заключается не в вставке std::vector
в std::map
. Ваш вопрос в том, как вы можете легко создать анонимный std::vector
с произвольными значениями начального элемента.
В ISO С++ 03 вы не можете. Однако С++ 11 позволяет использовать списки инициализации для этого.
Если вы застряли с компилятором С++ 03, возможно, вы можете создать вспомогательную функцию для возврата вектора с указанными элементами:
std::vector<int> make_vector(int a, int b)
{
std::vector<int> v;
v.push_back(a);
v.push_back(b);
return v;
}
Если векторы, которые вы вставляете, имеют разные размеры, вы можете использовать вариационную функцию, хотя для этого потребуется либо пройти по количеству элементов, либо иметь зарезервированное значение дозорного устройства.
Ответ 2
Если вам нужен пустой вектор, который вы можете сделать:
mymap.insert(pair<int,vector<int> >(10, vector<int>()));
Затем вы можете добавить любые элементы, которые вы хотите, с чем-то вроде:
mymap[10].push_back(1);
mymap[10].push_back(2);
Изменить. Удалено неверное утверждение о том, что векторы будут скопированы, если/когда карта будет расти. Как отмечали комментаторы, это не относится к std:: map, который основан на node.
Ответ 3
Если вы используете С++ 11, вы можете использовать векторный список инициализации конструктор (последний конструктор в этом списке), который будет выглядеть так:
mymap.insert(pair<int, vector<int> > (10, {1, 2, 3}));
Если вы можете использовать только С++ 03, vector
имеет конструктор, который принимает размер и значение по умолчанию для каждого элемента, которого может быть достаточно для вас. В противном случае вам придется построить вектор, а затем вставить его. Если вы хотите избежать непредсказуемой копии вектора при вставке, вы можете swap
сделать это так:
vector<int> myvec;
myvec.push_back(1);
myvec.push_back(2);
mymap[10].swap(myvec);
Таким образом, вектор не нужно копировать. Вы получите дополнительную конструкцию по умолчанию, но это не очень дорого.
Ответ 4
#put something here#
= vector<int>{1,2}
Я удивлен, хотя {1,2}
не работал. Вы не используете компилятор С++ 11? Если нет, вы можете создать только вектор с конструктором по умолчанию (без значений) или сначала заполнить его значениями и вставить его.
Ответ 5
Это должно работать в компиляторах С++ 2003.
#include <iostream>
#include <vector>
#include <map>
#include <cassert>
using namespace std;
std::vector<int> make_vector(int a, int b) {
std::vector<int> result;
result.push_back(a);
result.push_back(b);
return result;
}
int main()
{
map <int, vector<int> > mymap;
mymap.insert(make_pair(10, make_vector(1,2)));
// Or, alternatively:
// mymap[10] = make_vector(1,2);
assert(mymap[10][0] == 1);
assert(mymap[10][1] == 2);
return 0;
}
Ответ 6
С++ 03 не имеет списков инициализаторов, что может быть болью для инициализации коллекций.
Если вы не можете перейти на более современную версию компилятора, вы всегда можете использовать библиотеку Boost.Assignment
. Он имеет list_of
именно для этого.
#put something here# -> boost::assign::list_of(1)(2)