Перебирая 2D-вектор "char" в C ++, пустые символы не выводятся - PullRequest
0 голосов
/ 05 марта 2011

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

const int width  = 100;
const int height = 35;
vector< vector<char> > buffer(width, vector<char>(height,0));

for (int y = 0; y < height; ++y)
    for (int x = 0; x < width; ++x)
        buffer[x][y] = ' ';

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

vector<vector<char> >::const_iterator row;
vector<char>::const_iterator col;
for (row = buffer.begin(); row != buffer.end(); row++) {
    for (col = row->begin(); col != row->end(); col++) {
            cout << *col;
    }
    cout << endl;
}

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

Ответы [ 2 ]

0 голосов
/ 19 апреля 2012

Вам не нужно использовать <code>vector<vector<char> >::iterator. Класс вектор перегружен для вас индексом <code>operator[]. Таким образом, вы можете написать:

for(size_t i = 0; i < height; i++)
{
    for(size_t j = 0; j < width; j++)
    {
        cout << buffer[i][j]; // buffer is a vector<vector<char> >
    }
    cout << "\n";
}
0 голосов
/ 14 марта 2011

Мой первый вопрос: «почему вы используете векторы для простого двумерного массива?» Я бы просто использовал двумерный массив и покончил с этим. Эффективный способ выделить 2-D массив объектов одним вызовом malloc () (чтобы его можно было освободить одним вызовом free ()):

/* set up the memory for a 2D matrix with entries of size "size" */
void** matrix2D(long rows, long columns, long size)
{
    long    i;
    unsigned long long      row_size = (unsigned long long)columns * (unsigned long long)size;
    unsigned long long      data_size = ((unsigned long long)rows * (unsigned long long)columns + 1) * (unsigned long long)size;
    unsigned long long      pointer_size = (unsigned long long)rows * sizeof(void*);
    void**  result;

    if ( (result = (void**)malloc((size_t)(data_size + pointer_size))) == NULL ) {
            return NULL;
    }

    // take the first bit for a vector pointing to the m_pData for each row
    char* pdata = (char*)result + pointer_size;
    if ((unsigned long)pdata % size) {
      pdata += size - (unsigned long)pdata % size;
    }

    // for each row, set up the pointer to its m_pData
    for (i = 0; i < rows; i++) {
            result[i] = (void*)pdata;
            pdata += row_size;
    }

    return result;
}

Затем я бы настроил вашу матрицу, используя:

char** buffer = (char**)matrix2D(height, width, sizeof(char));

Я бы инициализировал массив, используя:

for (int i = 0; i < height; ++i)
    for (int j = 0; j < width; ++j)
        buffer[i][j] = ' ';

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

for (int i = 0; i < height; ++i) {
    for (int j = 0; j < width; ++j)
        cout << buffer[i][j];
    cout << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...