有沒有辦法實作像[][]一維陣列這樣的運算子?
我想在我的代碼中將 2D 向量的實作更改為 1D 向量(因為這在我的程式中將執行速度提高了大約 P)。二維矢量支持[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(不要重復自己)。我怎樣才能以有效和慣用的方式做到這一點?我想隱藏復雜性并讓事情變得有點抽象,就像operator[][]2D 矢量一樣。
uj5u.com熱心網友回復:
C 不允許虛擬容器。因此,如果您希望像真正的迭代器這樣的好東西都能順利作業,那么運算子 [] 應該回傳一個預期大小的真實物件。
這是我的一篇關于多維容器的迭代器問題和代碼審查的更一般問題的帖子
如果您只想構建一個operator[](int)回傳可以接受 second的東西,則可以通過在向量的內部資料陣列中回傳一個普通指標[]來輕松地為2D 向量完成:
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";
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/429320.html
上一篇:是否可以通過麥克風播放音頻?
