【发布时间】:2020-06-14 15:01:19
【问题描述】:
我正在使用二维 std::vector 编写自定义类 Matrix。 所以问题是我需要为迭代器重载++操作,这样我就可以一次遍历整个矩阵。
template <typename T>
class Matrix {
private:
std::vector<std::vector<T>> arr;
public:
Matrix(const std::vector<std::vector<T>>& tmp) {
arr = tmp;
}
std::pair<size_t, size_t> size() const {
std::pair<size_t, size_t> tmp;
if (arr.empty()) {
tmp.first = 0;
tmp.second = 0;
} else {
tmp.first = arr.size();
tmp.second = arr[0].size();
}
return tmp;
}
T operator () (size_t i, size_t j) const {
return arr[i][j];
}
Matrix& transpose() {
std::vector<std::vector<T>> tmp(size().second, std::vector<T>(size().first));
for (size_t i = 0; i < size().first; ++i) {
for (size_t j = 0; j < size().second; ++j) {
tmp[j][i] = arr[i][j];
}
}
*this = Matrix(tmp);
return *this;
}
Matrix transposed() const {
std::vector<std::vector<T>> tmp(size().second, std::vector<T>(size().first));
for (size_t i = 0; i < size().first; ++i) {
for (size_t j = 0; j < size().second; ++j) {
tmp[j][i] = arr[i][j];
}
}
return Matrix(tmp);
}
typename std::vector<T>::iterator begin() {
return arr[0].begin();
}
typename std::vector<T>::iterator end() {
return arr[size().first-1].end();
}
};
例如,使用矩阵 mat = {{1,2},{3,4}},应该可以:
vector<vector<int>> arr = {{1,2},{3,4}};
Matrix mar(arr);
auto it = mat.begin();
while (it != mat.end()) {
cout << *it << " ";
}
输出应该是:
1 2 3 4
您能帮我如何为std::vector 迭代器重载operator++()、begin() 和end()?
【问题讨论】:
-
看起来您想创建自己的迭代器。如果您以前从未这样做过,这可能会有点棘手。这是一些info about iterators。
-
旁白:如果你的作业允许,考虑
T operator[](std::pair<size_t, size_t>) const;(或T&和const T&)而不是T operator () (size_t i, size_t j) const -
旁白:
transpose()可以简化为*this = transposed(); return *this;
标签: c++ matrix vector iterator operator-overloading