序列的矢量

时间:2009-04-15 10:43:13

标签: c++

我有这个数据结构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

7 个答案:

答案 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]);