Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储二维对象阵列的最佳方法是什么? < >我想在C++中存储C++对象,我想创建对象: Vector2D<MyObject*> objects = new Vector2D<MyObject*>(M,N); MyObject* obj = new MyObject; objects.add(i,j, obj); Vector2D对象=新的Vector2D(M,N); MyObject*obj=新的MyObject; 对象。添加(i、j、obj);_C++_Multidimensional Array - Fatal编程技术网

存储二维对象阵列的最佳方法是什么? < >我想在C++中存储C++对象,我想创建对象: Vector2D<MyObject*> objects = new Vector2D<MyObject*>(M,N); MyObject* obj = new MyObject; objects.add(i,j, obj); Vector2D对象=新的Vector2D(M,N); MyObject*obj=新的MyObject; 对象。添加(i、j、obj);

存储二维对象阵列的最佳方法是什么? < >我想在C++中存储C++对象,我想创建对象: Vector2D<MyObject*> objects = new Vector2D<MyObject*>(M,N); MyObject* obj = new MyObject; objects.add(i,j, obj); Vector2D对象=新的Vector2D(M,N); MyObject*obj=新的MyObject; 对象。添加(i、j、obj);,c++,multidimensional-array,C++,Multidimensional Array,以后,我应该以类似的方式访问这些项目。 请给我建议最好的主意,而不仅仅是方法。我认识的人很少 编辑: 基本上我需要的是,为通用对象的MxN网格分配内存。只需添加/检索具有给定行和列的项。最好使用结构数组,结构字段取决于MyObject的字段类型。最好使用结构数组,结构字段取决于MyObject的字段类型最简单的方法是: vector<vector<MyObject>> objects ; 矢量对象; 不幸的是,您必须编写一些代码来将每一行的大小初始化为N 微软chan

以后,我应该以类似的方式访问这些项目。 请给我建议最好的主意,而不仅仅是方法。我认识的人很少

编辑:
基本上我需要的是,为通用对象的MxN网格分配内存。只需添加/检索具有给定行和列的项。

最好使用结构数组,结构字段取决于MyObject的字段类型。

最好使用结构数组,结构字段取决于MyObject的字段类型最简单的方法是:

vector<vector<MyObject>> objects ;
矢量对象;
不幸的是,您必须编写一些代码来将每一行的大小初始化为N

微软channel9网站上有一个很好的讲座,Stephan T.Lavavej(是的,他的首字母缩写是STL)正是为了解决nurikabe难题而做的


最简单的方法是:

vector<vector<MyObject>> objects ;
矢量对象;
不幸的是,您必须编写一些代码来将每一行的大小初始化为N

微软channel9网站上有一个很好的讲座,Stephan T.Lavavej(是的,他的首字母缩写是STL)正是为了解决nurikabe难题而做的


< P> > P>你似乎来自于C++或java世界的C++领域。欢迎在C++中,你有自动存储对象,你不必去代码>新< /代码>一切。如果您还有

Vector2D
类,这就足够了

Vector2D<MyObject> objects(M,N);
MyObject obj;
objects.add(i,j, obj);
// you can do this.
objects[row][col].callObject();

<>看起来你是来自C++或java世界的C++领域。欢迎在C++中,你有自动存储对象,你不必去代码>新< /代码>一切。如果您还有
Vector2D
类,这就足够了

Vector2D<MyObject> objects(M,N);
MyObject obj;
objects.add(i,j, obj);
// you can do this.
objects[row][col].callObject();

我将创建一个向量向量,并重载所有需要的操作符。因此,您可以重用std实现。
但是首先想想,你想如何访问这个向量2D。它真的是向量还是其他存储类型更好。

我会创建向量向量并重载所有需要的操作符。因此,您可以重用std实现。
但是首先想想,你想如何访问这个向量2D。它真的是向量还是其他存储类型更好。

使用现代C++11编译器,您可以使用内置的
数组
初始值设定项列表
,它看起来像这样:

    #include <array>
    using namespace std;
    ...

    vector<vector<int>> Objects;

    // Initialization
    Objects = {{1,2,3}, {4,4,5}};
    // Iterating
    for ( auto it = Objects.begin(); it != Objects.end(); ++it) {
      // you can access the arrays with *it in here
      for( auto it2 = *it->begin(); it2 != *it->end(); ++it2) {
        // you can access values directly with *it2
        *it2 = 1;
      }
    }
#包括
使用名称空间std;
...
矢量对象;
//初始化
Objects={1,2,3},{4,4,5};
//迭代
对于(自动it=Objects.begin();it!=Objects.end();+it){
//您可以在此处使用*访问阵列
对于(自动it2=*it->begin();it2!=*it->end();++it2){
//您可以使用*it2直接访问值
*it2=1;
}
}

您可以使用auto,让编译器像我一样计算出类型,或者您可以指定
it
it2
实际上是向量迭代器。

对于现代C++11编译器,您可以使用内置的
数组
初始值设定项列表
,它看起来像这样:

    #include <array>
    using namespace std;
    ...

    vector<vector<int>> Objects;

    // Initialization
    Objects = {{1,2,3}, {4,4,5}};
    // Iterating
    for ( auto it = Objects.begin(); it != Objects.end(); ++it) {
      // you can access the arrays with *it in here
      for( auto it2 = *it->begin(); it2 != *it->end(); ++it2) {
        // you can access values directly with *it2
        *it2 = 1;
      }
    }
#包括
使用名称空间std;
...
矢量对象;
//初始化
Objects={1,2,3},{4,4,5};
//迭代
对于(自动it=Objects.begin();it!=Objects.end();+it){
//您可以在此处使用*访问阵列
对于(自动it2=*it->begin();it2!=*it->end();++it2){
//您可以使用*it2直接访问值
*it2=1;
}
}

您可以使用auto并让编译器像我一样计算出类型,或者您可以指定
it
it2
实际上是向量迭代器。

您可以生成二维向量。参考资料:

假设在
MyObject
类中有一个函数
callObject

Vector2D<MyObject> objects(M,N);
MyObject obj;
objects.add(i,j, obj);
// you can do this.
objects[row][col].callObject();

但是如果您想存储稀疏矩阵,那么您可以这样做

std::vector<std::vector<MyObject*>objects(MaxRow, 
                           std::vector<MyObject>(MaxCol, nullptr);
objects[2][3] = new MyObject(/*your arguments*/);

objects[2][3].callObject();

objects[0][0].callObject(); // Boom !!! Null pointer here.
使用unique_ptr处理删除和其他引用事项



通过在Vector2D中继承
std::vector
,您可以“获得很多其他东西”,但在大多数情况下,合成比继承更好。

您可以创建2D向量。参考资料:

假设在
MyObject
类中有一个函数
callObject

Vector2D<MyObject> objects(M,N);
MyObject obj;
objects.add(i,j, obj);
// you can do this.
objects[row][col].callObject();

但是如果您想存储稀疏矩阵,那么您可以这样做

std::vector<std::vector<MyObject*>objects(MaxRow, 
                           std::vector<MyObject>(MaxCol, nullptr);
objects[2][3] = new MyObject(/*your arguments*/);

objects[2][3].callObject();

objects[0][0].callObject(); // Boom !!! Null pointer here.
使用unique_ptr处理删除和其他引用事项



通过在Vector2D中继承
std::vector
,您可以“获得很多其他东西”,但在大多数情况下,合成比继承更好。

MyObject obj=new MyObject不编译。是否要在堆栈上或堆上创建它们?这是一个毫无意义的问题,除非您对“最佳”的含义有所了解。我看到您已编辑了该问题。现在你正在尝试C++,就像它是java一样。C++不是java,试图假装它会在最好的情况下得到你的次优程序,最坏的结果是整个痛苦。这种方法不可能被认为是“最好的想法”。@john这可能是稀疏矩阵的一种好方法。除了初始的新矢量2D。
MyObject obj=新的MyObject不编译。是否要在堆栈上或堆上创建它们?这是一个毫无意义的问题,除非您对“最佳”的含义有所了解。我看到您已编辑了该问题。现在你正在尝试C++,就像它是java一样。C++不是java,试图假装它会在最好的情况下得到你的次优程序,最坏的结果是整个痛苦。这种方法不可能被认为是“最好的想法”。@john这可能是稀疏矩阵的一种好方法。除了最初的新Vector2D。是的,我来自java背景。现在的问题是我需要Vector2D课程。我在问什么更好