Подтвердить что ты не робот

Вставить вектор для значения в карте в С++

Я застрял в попытке выяснить, как вставить вектор для значения на карте. Например:

#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

4b9b3361

Ответ 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)