Skip to content

Instantly share code, notes, and snippets.

@grayed
Last active April 17, 2024 12:51
Show Gist options
  • Save grayed/ef211926bc545f1af4148a7e9811bd1b to your computer and use it in GitHub Desktop.
Save grayed/ef211926bc545f1af4148a7e9811bd1b to your computer and use it in GitHub Desktop.
TwoDimArray
#include <chrono>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
class TwoDimArray {
double *data;
size_t nrows, ncols;
public:
TwoDimArray() : data(nullptr), nrows(0), ncols(0) {}
TwoDimArray(size_t nrows, size_t ncols) : nrows(nrows), ncols(ncols) {
data = new double[nrows * ncols];
memset(data, 0, nrows * ncols * sizeof(double));
}
~TwoDimArray() { delete[] data; }
class Row {
friend class TwoDimArray;
double* p;
size_t n;
Row(double *p, size_t n) : p(p), n(n) {}
public:
double operator[](size_t idx) const { /*контроль*/ return p[idx]; }
double& operator[](size_t idx) { /*контроль*/ return p[idx]; }
};
double value(size_t row, size_t col) const { return data[row*ncols + col]; }
double& value(size_t row, size_t col) { return data[row*ncols + col]; }
double operator()(size_t row, size_t col) const { return data[row*ncols + col]; }
double& operator()(size_t row, size_t col) { return data[row*ncols + col]; }
const Row operator[](size_t row) const { return Row(data + (ncols * row), ncols); }
Row operator[](size_t row) { return Row(data + (ncols * row), ncols); }
size_t cols() const { return ncols; }
size_t rows() const { return nrows; }
};
class TwoDimArray2 {
vector<vector<double>> data;
public:
TwoDimArray2() {}
TwoDimArray2(size_t nrows, size_t ncols) : data(nrows, vector<double>(ncols, 0.0)) {}
~TwoDimArray2() { }
double value(size_t row, size_t col) const { return data[row][col]; }
double& value(size_t row, size_t col) { return data[row][col]; }
double operator()(size_t row, size_t col) const { return data[row][col]; }
double& operator()(size_t row, size_t col) { return data[row][col]; }
const vector<double>& operator[](size_t row) const { return data[row]; }
vector<double>& operator[](size_t row) { return data[row]; }
size_t cols() const { return data.empty() ? 0 : data[0].size(); }
size_t rows() const { return data.size(); }
};
/// Написать код, сравнивающий производительность обоих решений
/// Должен работать минимум 30с каждый
int main() {
chrono::high_resolution_clock clock;
auto start = clock.now();
TwoDimArray arr(5, 4);
arr.value(2, 2) = 5;
arr(3, 4) = 2;
arr[3][1] = 7;
auto end = clock.now();
auto d = end - start;
cout << "we worked for " << d.count() << " seconds" << endl;
for (size_t i = 0; i < arr.rows(); i++) {
for (size_t j = 0; j < arr.cols(); j++) {
if (j)
cout << '\t';
cout << arr.value(i, j);
}
cout << endl;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment