今天一不留神在MSDN上发现了一个STL处理多维数组的好例子.
- #include <vector>
- using namespace std;
- template <class T>
- class C2DVector
- {
- public:
- C2DVector():m_dimRow(0), m_dimCol(0){;}
- C2DVector(int nRow, int nCol) {
- m_dimRow = nRow;
- m_dimCol = nCol;
- for (int i=0; i < nRow; i++){
- vector<T> x(nCol);
- int y = x.size();
- m_2DVector.push_back(x);
- }
- }
- void SetAt(int nRow, int nCol, const T& value) throw(std::out_of_range) {
- if(nRow >= m_dimRow || nCol >= m_dimCol)
- throw out_of_range("Array out of bound");
- else
- m_2DVector[nRow][nCol] = value;
- }
- T GetAt(int nRow, int nCol) {
- if(nRow >= m_dimRow || nCol >= m_dimCol)
- throw out_of_range("Array out of bound");
- else
- return m_2DVector[nRow][nCol];
- }
- void GrowRow(int newSize) {
- if (newSize <= m_dimRow)
- return;
- m_dimRow = newSize;
- for(int i = 0 ; i < newSize - m_dimCol; i++) {
- vector<int> x(m_dimRow);
- m_2DVector.push_back(x);
- }
- }
- void GrowCol(int newSize) {
- if(newSize <= m_dimCol)
- return;
- m_dimCol = newSize;
- for (int i=0; i <m_dimRow; i++)
- m_2DVector[i].resize(newSize);
- }
- vector<T>& operator[](int x) {
- return m_2DVector[x];
- }
- private:
- vector< vector <T> > m_2DVector;
- unsigned int m_dimRow;
- unsigned int m_dimCol;
- };
复制代码
C2DVector 类封装了一个动态二维数组。在建立数组时可设置其大小。例如,C2DVector <int>a(3,4); 将建立一个 3 x 4 的数组。
C2DVector 是动态的,因此它的两个维可以增加。例如,my2DArray.GrowCol(5); 可将该二维数组增大到 5 列。此外,由于我们已经重载了操作符 [],因此它可以像常规 C/C++ 二维数组一样使用。因此,my2DArray[x][y] = 5 之类的语法是受支持的。 |