我有这个数据结构Seq,它继承了类向量,但有一些额外的功能。 使用这个数据结构Seq我有这个预定义的数据结构:
typedef Seq< vector<int> > MxInt2d;
我现在想要一个MxInt2d类型的几个组件的向量; 我在考虑类似的事情:
MxInt2d* loops;
只是我认为我必须初始化这个向量而我没有它的构造函数。我应该编写一个构造函数来初始化它吗?
因此,如果一方面我将声明以下数据结构:
MxInt2d myEdges_;
然后初始化。 另一方面,我的变量循环声明:
vector<MxInt2d> loops;
如果我想在循环[0]中复制myEdges_的前5个元素,我会使用语法:
for (int i=0;i<5;i++)
loops[0].push_back(myEdges_[i]);
程序被编译但是当我运行它时,我得到一个总线错误消息.. 如果我将初始化用于第二个循环,则会发生同样的事情:
for (int i=0;i<5;i++){
loops[1].push_back(myEdges_[i]);
}
(抱歉我的判断错误,我对矢量很新) madalina
答案 0 :(得分:3)
除非必须,否则不要使用指针。再次使用vector
:
vector<MxInt2d> loops;
现在,loops
容器是空的(即里面没有矩阵)。如果您希望它包含2个MxInt2d
对象,则您必须以不同方式插入它们或初始化loops
:
// loops will contain two empty MxInt2d objects
vector<MxInt2d> loops(2);
// after the following command,
// loops will contain 3 MxInt3d objects
loops.push_back(MxInt2d());
只有在填充loops
之后,才能开始填充其元素。
答案 1 :(得分:3)
在遇到问题之前 - 观察:
你继承了这个载体吗?导出矢量不是一个好主意。所有标准的STL容器,缺少虚拟析构函数,并且公开继承没有虚拟析构函数的类是一个主要的C ++禁忌。
答案 2 :(得分:0)
从STL容器继承并不是一个好主意,因为它们没有虚拟析构函数,如果你试图通过一个基指针删除一个派生指针,这可能导致欠定行为(希望我做对了)。 / p>
答案 3 :(得分:0)
实际上,您的数据结构看起来很复杂。通过创建它的指针,你使它变得更加复杂。如果你可以创建MxInt2d的数组/向量而不是使它成为指针,那就更好了。
答案 4 :(得分:0)
不,不一定。 std :: vector会将所有元素初始化为0,所以如果这是你需要的,你就不必编写自定义构造函数。
答案 5 :(得分:0)
数组在C ++中是邪恶的。您可以将矢量用于几乎可以使用数组的任何内容。一个常见的问题;初始化可以解决。请参阅此讨论how-to-initialize std::vector like 'C' array。
所以,你可以使用'vector loops;'没有问题。
HTH,
答案 6 :(得分:0)
你有几个问题。
一,你不应该从矢量派生出来。如果您需要使用向量执行自定义内容的代码,则应编写一个包含自定义内容的类,该类具有向量,而不是向量。例如:
class Seq
{
public:
// assorted constructors
// construct vec_ with zero elements
Seq() {};
// construct vec_ with one element
Seq(int singleItemToAdd)
: vec_(1, singleItemToAdd) {};
// construct vec_ with 'multipleItemsToAdd' elements
Seq(const int* multipleItemsToAdd, size_t numItemsToAdd)
: vec_(multipleItemsToAdd,multipleItemsToAdd+numItemsToAdd) {};
// assorted custom operations (instead of deriving from vector)
void customSeqOperation() const
{
/// your custom stuff here
: :
}
private:
vector<int> vec_;
};
接下来的问题,你说这段代码编译但在运行时崩溃:
vector<MxInt2d> loops;
for (int i=0;i<5;i++)
loops[0].push_back(myEdges_[i]);
如果这是你本质上竞争的代码,它崩溃的原因是因为循环[0]中没有元素 - 你还没有添加它。在访问第一个元素之前,需要将一个元素添加到循环(这是一个向量):
vector<MxInt2d> loops;
MxInt2d firstElement = getTheElement();
loops.push_back(firstElement);
for (int i=0;i<5;i++)
loops[0].push_back(myEdges_[i]);