2013-09-13 2 views
0

у меня есть указатель, указывающий на карту вектора указателей:C++ назначая вектор указателей на карту векторных указателей

std::map<int, std::vector<object *> > *m_mapvals; 

и разное количество векторных указателей:

int vecval = 1; 
std::vector<object *> *m_vecvals; 

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

Спасибо,

+0

Почему векторные указатели, а также карта? Почему бы просто не взглянуть на вектор на карте, когда вам это нужно? – doctorlove

+2

Это похоже на чрезмерно сложную структуру данных. – Borgleader

+0

Вы спрашиваете, как искать вещи на карте? – doctorlove

ответ

2
#include <iostream> 
#include <map> 
#include <vector> 

class Foo{ 
public: 
    int number; 

    Foo(int number){ 
     this->number = number; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    // structure 
    std::map<int, std::vector<Foo*>>* m_mapvals; 
    // and its init. 
    m_mapvals = new std::map<int, std::vector<Foo*>>(); 

    // one record 
    int vecval = 1; 
    std::vector<Foo *>* vecvals = new std::vector<Foo*>(); // init 
    vecvals->push_back(new Foo(42)); // fill with values 

    // insert record into structure 
    m_mapvals->insert(std::pair<int, std::vector<Foo*>>(vecval, *vecvals)); 

    // first at() selects the record, therefore result is vector 
    // the second at selects the first Foo object pointer from the vector 
    std::cout << "Number is: " << m_mapvals->at(1).at(0)->number; 

    return 0; 
} 

Это решает проблему, однако, я настоятельно рекомендую не использовать так много указателей. Вы, скорее всего, потеряете контроль над памятью. Вы используете суффикс m_, поэтому я предполагаю, что основная карта является атрибутом объекта. Как правило, нет никакого преимущества иметь указатель на карте или вектор между атрибутами. Если вы хотите создать динамически обновляемую коллекцию объекта, это может быть лучше и проще:

class Collection{ 
    std::map<int, std::vector<Foo*>> m_myCollection 
} 

или если нет никаких проблем с клонированием хранимых объектов, наиболее безопасным является

class Collection{ 
    std::map<int, std::vector<Foo>> m_myCollection 
} 

Но это зависит о сути проблемы. Тем не менее, здесь нет проблем с управлением памятью. Если вы создадите экземпляр этого класса с помощью нового, весь объект будет находиться в куче.

+0

Спасибо за объяснение! –

Смежные вопросы