Если массив разряженный, т.е. много незаполненных позиций, то неплохо подойдет имитация массива на основе map'а:
std::map< std::pair<int, int>, std::string > arr;
записать по произвольной позиции:
arr[std::pair<int, int>(1, 3)] = "abc";
прочитать:
std::string s = arr[std::pair<int, int>(1, 3)];