如何为一维数组实现 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";
    }
}