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

Карта векторов в STL?

Я хочу иметь карту векторов (но я не хочу использовать указатель для внутреннего вектора), возможно ли это?

// define my map of vector
map<int, vector<MyClass> > map;

// insert an empty vector for key 10. # Compile Error
map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>)); 

Я знаю, что если бы я использовал указатель для вектора, то это было бы хорошо, но мне интересно, могу ли я избежать использования указателя и использовать указанную выше структуру данных (я не хочу вручную удалять)

// define my map of vector
map<int, vector<MyClass>* > map;

// insert an empty vector for key 10.
map.insert(pair<int, vector<MyClass>* >(10, new vector<MyClass>)); 
4b9b3361

Ответ 1

Первая структура данных будет работать. Вы можете захотеть typedef часть кода, чтобы упростить будущую работу:

typedef std::vector<MyClass>      MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;

MyClassSetMap map;
map.insert(MyClassSetMap::value_type(10, MyClassSet()));

или (спасибо quamrana):

map[10] = MyClassSet();

Ответ 2

Да, но ваша вторая строка должна быть:

map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));

Вставляет пару, состоящую из целого числа 10 и пустой вектор. Оба будут скопированы, и если вы имеете дело с большими векторами, вы захотите быть осторожными с копиями.

Также: не переписывайте переменные "map", а using namespace std. Ты меня пугаешь, -)

Ответ 3

Используя typedefs из fbrereton, вы также можете сделать это:

typedef std::vector<MyClass>      MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;

MyClassSetMap map;
map[10]=MyClassSet();

Вы можете использовать operator[] вместо insert().. Это немного уменьшит линейный шум.

Ответ 4

Используйте функцию swap для эффективного добавления вашего вектора.

map<int, vector<SomeClass> > Map;

vector<SomeClass> vec;
//...add elements to vec

Map[1] = vector<int>();
// swap the empty vector just inserted with your vector.
Map[1].swap(vec); 

Ответ 5

Вы должны прочитать компиляцию сообщений об ошибках. Они обычно предоставляют вам всю необходимую информацию.
Ваш код дает ошибку 'illegal use of this type as an expression' в этой строке. Это означает, что вы используете тип, а не объект. Чтобы использовать объект, вы можете просто добавить() для вызова конструктора без аргументов.

map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));

Кстати, вы можете использовать std:: make_pair для создания пар. Он выводит типы аргументов, поэтому нет необходимости явно указывать их.

map.insert( make_pair( 10, vector<MyClass>() ) );

Ответ 6

Вы можете использовать операторы [].
Они вставляют значение в карту.

map[10]; // create the 10 element if it does not exist
         // using the default constructor.

Если вы собираетесь использовать сразу после построения, выполните:

std::vector<MyClass>&  v = map[10];

Теперь он создан, и у вас есть локальная ссылка на объект.

Ответ 7

Вам просто не хватает пары скобок:

map.insert(pair<int, vector<MyClass> >(10, vector<MyClass>()));

Кстати, есть вспомогательная функция std:: make_pair, которая заботится о выводе аргументов шаблона:

map.insert(make_pair(10, vector<MyClass>()));

Учитывая использование указателя на динамически выделенный вектор, это довольно плохая идея, поскольку это заставит вас нести ответственность за управление экземпляром. Кроме того, поскольку карта никогда не должна перемещать содержимое в памяти, нет ничего, что можно было бы улучшить с точки зрения производительности.

Ответ 8

Давайте немного используем С++ 11;)

typedef std::vector<MyClass>      MyClassSet;
typedef std::map<int, MyClassSet> MyClassSetMap;

MyClassSetMap map;
map.emplace(myid, MyClassSet());

Чтобы узнать, можно ли это вставить:

const auto result = map.emplace(myid, MyClassSet());
return (result.second) 
? "Is_OK"
: "Maybe "+myid+" exists\n"; 

И вот флагманский С++ 11 и карты.... как вставить в эту карту пару, если она не существует, и если она существует, просто вставьте новый элемент в вектор....

const auto result = map.emplace(myid, MyClassSet());
result.first->second.emplace(objSet);

Надеюсь дать полезную информацию!!!