Лучший способ представить 2-D массив в C++ с размером, определенным во время выполнения

Так что это было мое плохо. Очевидно, если

- (BOOL)shouldInvalidateLayoutForBoundsChange:(NSRect)newBounds;

возвращает YES. Затем этот метод называется. Я только что изменил, что этот метод возвращает NO и метод prepareLayout был остановлен, вызывается все время.

19
задан Tristan Havelick 2 November 2008 в 00:10
поделиться

7 ответов

ручной динамический путь:

Скажем, Вы хотите массив width*height, самый эффективный путь состоит в том, чтобы просто использовать единственный размерный массив:

char *matrix = new char[width*height];

Для удаления его:

delete[] matrix;

Для доступа к нему:

char getArrayValue(char *matrix, int row, int col)
{
  return matrix[row + col*width];
}

Для изменения его:

void setArrayValue(char *matrix, int row, int col, char val)
{
  matrix[row + col*width] = val;
}
<час>

Матрица Повышения:

Рассматривают использование повышения:: матрица , если у Вас может быть зависимость.

Вы могли затем наброситься линейная алгебра повышения библиотеки.

Вот являются приблизительно примером кода повышения:: матрица :

#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;
matrix<char> m (3, 3);
for (unsigned i = 0; i < m.size1 (); ++ i)
    for (unsigned j = 0; j < m.size2 (); ++ j)
        m (i, j) = 3 * i + j;
<час>

На стеке для некоторых компиляторов:

Некоторые компиляторы на самом деле позволяют, Вы для создания массивов на стеке со временем выполнения определили размеры. g ++ пример такого компилятора. Вы не можете сделать этого VC по умолчанию ++ все же.

Так в g ++ это - действительный код:

int width = 10;
int height = 10; 
int matrix[width][height];

Drew Hall упомянул, что эту функцию C99 называют Массивами Переменной длины (VLAs), и это может, вероятно, быть включено в любом современном компиляторе.

24
ответ дан 30 November 2019 в 02:45
поделиться

Я обычно делаю что-то вроде этого:

char *matrix = new char [width * height];

matrix[i + j * width] = 'c'; // same as matrix[i][j] = 'c';

delete [] matrix;
9
ответ дан 30 November 2019 в 02:45
поделиться

Вы, кажется, пропускаете смысл C++ (C с классами) :-). Это - вид использования, это жить не может без класса для реализации его.

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

  • конструктор, который, данный n, просто создаст новый n*n массив символа (например, обуглившийся)..
  • функции членства, которые добираются и установленные значения на основе x.y, которые просто относятся к обуглившемуся [x*n+y];
  • деструктор, которые удаляют [] массив.
4
ответ дан 30 November 2019 в 02:45
поделиться

Что относительно std::vector< std::vector<int> > array2d;?

4
ответ дан 30 November 2019 в 02:45
поделиться

повышение:: multi_array

, делающий его вручную, будет путаницей.

2
ответ дан 30 November 2019 в 02:45
поделиться

Для истинной двумерной матрицы:

int n = get_int_from_user();

char** matrix = new char*[n];
for (int i = 0; i < n; i++) {
    matrix[i] = new char[n];
}

// Operations on matrix.

for (int i = 0; i < n; i++) {
    delete [] matrix[i];
}
delete matrix;

Просто первое, что пришло на ум. Ошибки, несомненно. Однако другие люди отправили более изящный подход, я думаю.

3
ответ дан 30 November 2019 в 02:45
поделиться

Мне нравится подход массива 1-d (выбранный ответ Brian R. Bondy) с расширением, что Вы переносите элементы данных в класс так, чтобы Вы не должны были отслеживать ширину отдельно:

class Matrix
{
    int width;
    int height;
    char* data;
public:
    Matrix();
    Matrix(int width, int height);
    ~Matrix();

    char getArrayValue(int row, int col);
    void setArrayValue(int row, int col, char val);
}

реализация является осуществлением для читателя. ;)

2
ответ дан 30 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: