代码之家  ›  专栏  ›  技术社区  ›  ozke

基于C++矢量的二维数组对象

  •  1
  • ozke  · 技术社区  · 15 年前

    如建议的那样 here 我修正了我的二维数字数组,使它与向量类一起工作。

    #include <vector>
    
    typedef std::vector<int> Array;
    typedef std::vector<Array> TwoDArray;
    

    下面是它的用法:

    TwoDArray Arr2D; 
    
    // Add rows
    for (int i = 0; i < numRows; ++i) {
        Arr2D.push_back(Array());
    }
    
    // Fill in test data
    for (int i = 0; i < numRows; i++) {    
        for (int j = 0; j < numCols; j++) {
            Arr2D[i].push_back(ofRandom(0, 10));           
        }
    }
    
    // Make sure the data is there
    for (int i = 0; i < numRows; i++) {    
        for (int j = 0; j < numCols; j++) {
            std::cout << Arr2D[i][j] << ' ';
        }
    std::cout << '\n';
    }
    

    我的问题是,如何对自定义对象而不是整数执行相同的操作?我尝试了通过MyObject和push_back(new MyObject())更改int;但是当我尝试访问它的函数时,它不能正常工作。

    先谢谢你。

    6 回复  |  直到 9 年前
        1
  •  1
  •   Naveen    15 年前

    new MyObject() 指针 新创建的类的实例 MyObject vector<MyObject> 然后你需要做一些 push_back(MyObject())

        2
  •  1
  •   Mihir Mehta    15 年前

    你需要改变

    typedef std::vector<int> Array;
    typedef std::vector<Array> TwoDArray;
    

    typedef std::vector<MyObject> Array;
    typedef std::vector<Array> TwoDArray;
    
        3
  •  1
  •   Adrian Regan    15 年前

    template<class T>
    struct Array2D {
        vector<vector<T>> Array;
    };
    

    Array2D<MyObject>::Array array;
    

    甚至

    Array2D<MyObject*>::Array array;
    

    像平常一样带着你的一天。。。。

        4
  •  1
  •   ThR37    15 年前

    如果我是你,我会使用指针数组而不是对象本身(但在执行“clear()”)之前,你必须注意释放。

    typedef std::vector<std::vector<myObject* > > 2DArray;
    
    2DArray A;
    for (int i=0; i<numRows;++i) A.push_back(std::vector<myObject* >(numColumns));
    
    myObject* M = new myObject(...);
    A[row][column] = M;
    
        5
  •  1
  •   Cubbi    15 年前

    C++ FAQ Lite 使你的阵型密集(而不是参差不齐)。你不会希望处理不同大小的行吧?

    #include <iostream>
    #include <random>
    #include <vector>
    
    template<typename T>
    class TwoDArray {
            std::vector<T> data;
            const size_t cols;
    public:
            TwoDArray(size_t R, size_t C) : data(R*C), cols(C) {}
            T operator()(size_t r, size_t c) const { return data[cols*r+c]; }
            T& operator()(size_t r, size_t c) { return data[cols*r+c]; }
    };
    
    int main()
    {
            // Make it
            const size_t numRows = 10;
            const size_t numCols = 10;
            TwoDArray<int> Arr2D(numRows, numCols);
    
            // Fill in test data
            std::random_device rd;
            std::mt19937 eng(rd());
            std::uniform_int_distribution<> unif(0,9);
            for (size_t i=0; i<numRows; ++i)
               for (size_t j=0; j<numCols; ++j)
                    Arr2D(i,j) = unif(eng);
    
            // Make sure the data is there
            for (size_t i = 0; i < numRows; i++) {
                for (size_t j = 0; j < numCols; j++) {
                     std::cout << Arr2D(i,j) << ' ';
                }
                std::cout << '\n';
            }
    
    }
    

    std::array .

        6
  •  0
  •   anon anon    15 年前

    struct MyObject {};
    
    typedef std::vector<MyObject> Array;
    typedef std::vector<Array> TwoDArray;
    
    // stuff
    
    Arr2D[i].push_back( MyObject() );  
    

    请注意,要将内容存储在向量中,它们必须是可复制和可分配的。