Так что это было мое плохо. Очевидно, если
- (BOOL)shouldInvalidateLayoutForBoundsChange:(NSRect)newBounds;
возвращает YES. Затем этот метод называется. Я только что изменил, что этот метод возвращает NO и метод prepareLayout
был остановлен, вызывается все время.
ручной динамический путь:
Скажем, Вы хотите массив 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), и это может, вероятно, быть включено в любом современном компиляторе.
Я обычно делаю что-то вроде этого:
char *matrix = new char [width * height];
matrix[i + j * width] = 'c'; // same as matrix[i][j] = 'c';
delete [] matrix;
Вы, кажется, пропускаете смысл C++ (C с классами) :-). Это - вид использования, это жить не может без класса для реализации его.
Вы могли просто использование STL или другая сторонняя библиотека классов, которая я уверен, имел бы структуру данных, которую Вы ищете, но, если Вам нужно к самокрутке, просто создают класс со следующими свойствами.
Что относительно std::vector< std::vector<int> > array2d;
?
Для истинной двумерной матрицы:
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;
Просто первое, что пришло на ум. Ошибки, несомненно. Однако другие люди отправили более изящный подход, я думаю.
Мне нравится подход массива 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);
}
реализация является осуществлением для читателя. ;)