Как передать 2D карту в качестве указателя на функцию - PullRequest
0 голосов
/ 15 января 2011

У меня есть 2 карты:

map<int, map<int, int> > m1;
map<int, map<int, int> > m2;

И я хочу заполнить их функцией:

void fillMaps (m1, m2) {
    * m1[0][0] = 5;
    * m2[0][1] = 4;
}

Как мне передать эти карты в функцию?Я предполагаю, что сама переменная может быть передана так:

map<int, map<int, int> > m1;
map<int, map<int, int> > m2;

fillMaps(m1, m2);

Но как мне определить типы переменных внутри функции, чтобы иметь возможность изменять значения карты?

Ответы [ 6 ]

3 голосов
/ 15 января 2011

Чтобы изменить карты в функции, вы хотите передать их по ссылке:

void fillMaps (map<int, map<int, int> >& m1, map<int, map<int, int> >& m2) {
    m1[0][0] = 5;
    m2[0][1] = 4;
}

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

2 голосов
/ 15 января 2011

Я дам немного другой ответ от других.Вы можете использовать шаблоны C ++ и заставить компилятор автоматически определять типы для вас:

template <typename T>
void fillMaps (T& m1, T& m2) {
    m1[0][0] = 5;
    m2[0][1] = 4;
}

Называйте это так:

map<int, map<int, int> > m1;
map<int, map<int, int> > m2;

fillMaps(m1, m2);

Таким образом вы передаете карты по ссылке.Кроме того, если позже вы измените тип карт (например, с помощью другой реализации карты или с использованием строк вместо целых), вам не придется изменять эту функцию.

2 голосов
/ 15 января 2011

Вы можете передать карты по ссылке или по указателю для изменения значений.

void fillMapsByReference (
    std::map<int, map<int, int> >& m1,
    std::map<int, map<int, int> >& m2)     {
    m1[0][0] = 5;
    m2[0][1] = 4;
}

void fillMapsByPointer (
    std::map<int, map<int, int> >* m1,
    std::map<int, map<int, int> >* m2)     {
    *m1[0][0] = 5;
    *m2[0][1] = 4;
}
1 голос
/ 15 января 2011

Используйте typedef, чтобы сделать код чище:

typedef map<int, map<int, int> > intmap;

void fillMaps(intmap &m1, intmap &m2)
{
     m1[0][0] = 5;
     m2[0][1] = 4;
}
0 голосов
/ 15 января 2011

Вот мой подход:

template <typename T>
class MapOfMaps
{
  public:
    // ...

  private:
    map<T, map<T, T> > m;
};

typedef MapOfMaps<int> MapOfIntMap;

void fillmap(MapOfIntMap& m1, MapOfIntMap& m2)
{
//...
}
0 голосов
/ 15 января 2011

Передайте значение по ссылке. Также вам нужно объявить тип m1 и m2 в fillMaps.

void fillMaps(map&ltint, map&ltint,int&gt &gt &ampm1, map&ltint, map&ltint,int&gt &gt &ampm2)
{
     // fill map code in here
     m1[0][0] = 5;
     m2[0][1] = 4;
}

Затем для вызова наберите fillMaps(m1, m2);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...