Чёрный 2D массив на карте в C ++ - PullRequest
0 голосов
/ 07 сентября 2011

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

map<char[50][50],int>M;

char brr[50][50];
//some operation here on the array
int aa=1;

if(M.find(brr)==M.end())
{
     M[brr]=aa;
     aa+=1;
}

что я делаю не так?

РЕДАКТИРОВАТЬ:

Я только что нашел другой способ.Таким образом, я могу добиться того, что я изложил в своем вопросе.Вместо использования 2d массива я просто собираюсь преобразовать его в строку и использовать.Он все равно даст тот же результат:

map<string,int>M;

char brr[50][50];
//some operation here on the array
int aa=1,i,j;

string ss="";

for(i=0;i<50;i++)
{
     for(j=0;j<50;j++)
     {
         ss+=brr[i][j];
     }
}

if(M.find(ss)==M.end())
{
     M[ss]=aa;
     aa+=1;
}

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Вы не можете.Массивы не могут быть назначены (т.е. вы не можете сделать brr = XXX; в вашем примере), и это требование типа ключа std::map.Кроме того, ключ должен иметь строгое слабое упорядочение , определенное для него (т. Е. Ему требуется operator< или функция компаратора).

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

0 голосов
/ 07 сентября 2011

Вы должны использовать класс-оболочку, и он должен поддерживать operator<.Если лексографический порядок подходит, вы можете сделать что-то вроде этого:

#include <boost/array.hpp>
#include <map>

int main()
{
    typedef boost::array<boost::array<char, 50>, 50> Array;

    std::map<Array, int> m;
}

boost::array можно заменить на std::array, если вы используете C ++ 11.

...