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

时间:2010-07-30 11:42:04

标签: c++ arrays memory multidimensional-array 2d

根据建议here我修复了我的2D数组,使其与Vector类一起使用。

标题文件:

#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';
}

我的问题是,如何为自定义对象而不是int数字执行相同的操作?我已经尝试通过MyObject更改int并使用push_back(new MyObject());但是当我尝试访问它的功能时,它无法正常工作。

提前谢谢。

6 个答案:

答案 0 :(得分:1)

你需要改变

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

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

答案 1 :(得分:1)

new MyObject()会将指针返回给新创建的类MyObject的实例。如果您创建了vector<MyObject>,那么您需要执行push_back(MyObject())

之类的操作

答案 2 :(得分:1)

试试这个:

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

现在您可以将其声明为任何对象

Array2D<MyObject>::Array array;

甚至

Array2D<MyObject*>::Array array;

随身携带你的一天......

请注意,当您将对象分配给stl容器时,它应该实现,默认的无参数构造函数,复制构造函数和重载操作符=(const和非const),否则您应该插入指向该对象的指针

答案 3 :(得分:1)

如果我是你,我会使用指针数组而不是对象本身(但是在执行“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;

答案 4 :(得分:1)

由于您正在寻找最佳设计方法,为什么不遵循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一样。

答案 5 :(得分:0)

概述:

struct MyObject {};

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

// stuff

Arr2D[i].push_back( MyObject() );  

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