Last active
April 17, 2024 12:51
-
-
Save grayed/ef211926bc545f1af4148a7e9811bd1b to your computer and use it in GitHub Desktop.
TwoDimArray
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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