对象传染媒介从一个习惯类的

时间:2014-11-05 15:55:21

标签: c++ class vector

在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;

}

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

编辑:

好的评论我改为以下行:vector MyWonderfulVector(10);

所以我的问题是我没有初始化矢量的大小(来自Matlab的坏习惯;))据我所知,如果我没有将矢量初始化为固定大小,我必须将对象推回到&#34;增加&#34;矢量的大小。所以,我应该创建一个临时的自定义对象来分配字段,然后将这个临时对象push_back到向量中。如果其中一位评论者希望将其纳入答案......

5 个答案:

答案 0 :(得分:8)

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

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 );
}

答案 1 :(得分:8)

您在行

中声明vector Custom
   vector<Custom> MyWonderfulVector;

但它是一个空的vector。里面没有物品。当您尝试访问vector循环中for的元素时,您正在使用越界索引访问vector

我可以考虑以下选项来解决这个问题。

  1. 使用初始尺寸创建vector

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

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

    }

答案 2 :(得分:2)

之前我遇到了同样的问题。我尝试使用vector类中的push_back函数并且它工作正常。也许它会解决你的问题

答案 3 :(得分:1)

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

答案 4 :(得分:0)

在访问元素之前尝试使用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);
}

这是一种方法。