存储二维对象阵列的最佳方法是什么? < >我想在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课程。我在问什么更好