如何为一维数组实现 operator[][]
How to implement operator[][] for 1D arrays
有没有办法为一维数组实现像 [][]
这样的运算符?
我想在我的代码中将 2D 向量的实现更改为 1D 向量(因为这会使我的程序的执行速度提高大约 %50)。二维矢量支持[y][x]
。我怎样才能为一维矢量提供这样的功能?
我可以这样做:
const size_t Y_Axis { 20 };
const size_t X_Axis { 30 };
std::vector<char> vec( Y_Axis * X_Axis );
size_t row { 5 };
size_t col { 28 };
vec[ row * X_Axis + col ] = 't'; // assign a value to a specific row-column
但是,在整个源文件中多次键入此公式似乎违反了 DRY(不要重复自己)。我怎样才能以有效和惯用的方式做到这一点?我想隐藏复杂性并使事情有点抽象,就像 2D 矢量的 operator[][]
一样。
C++ 不允许 虚拟 容器。所以运算符 [] 应该 return 一个预期大小的真实对象,如果你想让像真正的迭代器这样的所有好东西都能顺利工作。
这是一个post of mine about the iterator question for multi-dimensional containers and a more general question on Code Review
如果您只想构建一个 operator[](int)
return 的 可以接受第二个 []
的东西 ,它可以很容易地二维向量,通过return在向量的内部数据数组中设置一个普通指针:
template <typename T>
class vec2d {
std::vector<T> data;
size_t _cols;
public:
vec2d(int rows, int cols, T* src = nullptr)
: data(rows * cols), _cols(cols) {
if (src != nullptr) {
for (T& val : data) {
val = *src++;
}
}
}
T* operator [] (size_t row) {
return data.data() + row * _cols;
}
const T* operator [] (size_t row) const {
return data.data() + row * _cols;
}
size_t rows() const {
return data.size() / _cols;
}
size_t cols() const {
return _cols;
}
};
这是一个用法示例:
int main() {
vec2d<char> v(3, 4, "ABCDEFGHIJKL");
for (size_t i = 0; i < v.rows(); i++) {
for (size_t j = 0; j < v.cols(); j++) {
std::cout << v[i][j] << ' ';
}
std::cout << "\n";
}
}
有没有办法为一维数组实现像 [][]
这样的运算符?
我想在我的代码中将 2D 向量的实现更改为 1D 向量(因为这会使我的程序的执行速度提高大约 %50)。二维矢量支持[y][x]
。我怎样才能为一维矢量提供这样的功能?
我可以这样做:
const size_t Y_Axis { 20 };
const size_t X_Axis { 30 };
std::vector<char> vec( Y_Axis * X_Axis );
size_t row { 5 };
size_t col { 28 };
vec[ row * X_Axis + col ] = 't'; // assign a value to a specific row-column
但是,在整个源文件中多次键入此公式似乎违反了 DRY(不要重复自己)。我怎样才能以有效和惯用的方式做到这一点?我想隐藏复杂性并使事情有点抽象,就像 2D 矢量的 operator[][]
一样。
C++ 不允许 虚拟 容器。所以运算符 [] 应该 return 一个预期大小的真实对象,如果你想让像真正的迭代器这样的所有好东西都能顺利工作。
这是一个post of mine about the iterator question for multi-dimensional containers and a more general question on Code Review
如果您只想构建一个 operator[](int)
return 的 可以接受第二个 []
的东西 ,它可以很容易地二维向量,通过return在向量的内部数据数组中设置一个普通指针:
template <typename T>
class vec2d {
std::vector<T> data;
size_t _cols;
public:
vec2d(int rows, int cols, T* src = nullptr)
: data(rows * cols), _cols(cols) {
if (src != nullptr) {
for (T& val : data) {
val = *src++;
}
}
}
T* operator [] (size_t row) {
return data.data() + row * _cols;
}
const T* operator [] (size_t row) const {
return data.data() + row * _cols;
}
size_t rows() const {
return data.size() / _cols;
}
size_t cols() const {
return _cols;
}
};
这是一个用法示例:
int main() {
vec2d<char> v(3, 4, "ABCDEFGHIJKL");
for (size_t i = 0; i < v.rows(); i++) {
for (size_t j = 0; j < v.cols(); j++) {
std::cout << v[i][j] << ' ';
}
std::cout << "\n";
}
}