自定义类中对象的矢量

Vector of object from a custom class

本文关键字:对象 自定义      更新时间:2023-10-16

在C++中,我声明了一个自定义类来存储对象的一些值。然后,我声明所述对象的向量。最后,我对向量进行迭代,为字段赋值。

#include <vector>
using namespace std;
class Custom
{ 
    public:
        int metric,nX,nY;
    private:
};
int main( int argc, char** argv )
{
vector<Custom> MyWonderfulVector;
// Some code//
for(int i=0 ; i<10 ; i++){
MyWonderfulVector[i].metric = computation1();
MyWonderfulVector[i].nX= computation2();
MyWonderfulVector[i].nY= computation3();
}
return 0;
}

当它试图评估MyWonderfulVector[i].metric = computation1();时,它抛出一个vector subscript out of rangemetric是int,computation1()也是int。在第一次迭代时,i=0,所以应该没问题。奇怪的是,在代码的其他地方,我有另一个类的向量(包含在库中),这种语法适用于它,所以我不明白为什么它在这里不起作用。

编辑:

好的,有了评论,我改成了下面一行:向量MyWonderfulVector(10);

所以我的问题是我没有初始化向量的大小(Matlab的坏习惯;))根据我的理解,如果我没有将向量初始化为固定大小,我必须将对象推回以"增加"向量的大小。因此,我应该创建一个临时的自定义对象来分配字段,然后将这个临时对象推回到向量中。如果有一个评论者想把这个变成一个答案。。。

您定义了一个没有元素的向量

vector<Custom> MyWonderfulVector;

如果您像一样调用其成员函数empty

std::cout << std::boolalpha << MyWonderfulVector.empty() << std::endl;

那么你会得到true

因此,除了索引为0之外,您可能不会使用应用于ampty向量的下标运算符,但在任何情况下,您都可能不会赋值。

您可以使用some_variable元素(如)最初定义矢量

vector<Custom> MyWonderfulVector( some_variable );

然后你就可以使用你的循环了。或者可以为向量中的some_variable元素保留空间,在这种情况下使用成员函数push_back而不是下标运算符。例如

vector<Custom> MyWonderfulVector;
MyWonderfulVector.reserve( some_variable );

for ( int i=0 ; i<some_variable ; i++ )
{
    Custom obj;
    obj.metric = computation1();
    obj.nX= computation2();
    obj.nY= computation3();
    MyWonderfulVector.push_back( obj );
}

在行中声明Customs的vector

   vector<Custom> MyWonderfulVector;

但是它是空的CCD_ 12。其中没有项目。当您尝试在for循环中访问vector的元素时,您正在使用越界索引访问vector

我可以想出以下几种办法来解决这个问题。

  1. 创建具有初始大小的vector

     vector<Custom> MyWonderfulVector(10);
    
  2. 添加到for循环中的vector

    for(int i=0 ; i<10 ; i++){
      Custom c;
      c.metric = computation1();
      c.nX= computation2();
      c.nY= computation3();
      MyWonderfulVector.push_back(c);
    

    }

我以前也遇到过同样的问题。我试着使用向量类中的push_back函数,它成功了。也许它可以解决您的问题

矢量与数组不同。您需要使用push_back

在访问元素之前尝试使用resize()。所以你的代码将变成:

for(int i=0 ; i<10 ; i++){
MyWonderfulVector.resize(i);
MyWonderfulVector[i].metric = computation1();
MyWonderfulVector[i].nX= computation2();
MyWonderfulVector[i].nY= computation3();
}

如果您还想添加一些其他元素,可以将向量的大小存储在size_t变量中,并在每次添加其他元素时递增。

size_t my_vector_size = MyWonderfulVector.size();
for(int i=0 ; i<10 ; i++)
{
    my_vector_size++;
    MyWonderfulVector.resize(my_vector_size);
}

这是一种方法。