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

Doo*_*bot 5 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;

}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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

Vla*_*cow 8

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

vector<Custom> MyWonderfulVector;
Run Code Online (Sandbox Code Playgroud)

如果你调用它的成员函数empty一样

std::cout << std::boolalpha << MyWonderfulVector.empty() << std::endl;
Run Code Online (Sandbox Code Playgroud)

那你会得到的 true

所以你可能不会使用应用于ampty向量的下标运算符,除了索引0,但在任何情况下你都不能赋值.

您可以最初使用some_variable 类似元素定义向量

vector<Custom> MyWonderfulVector( some_variable );
Run Code Online (Sandbox Code Playgroud)

然后你可以使用你的循环.或者您可以为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 );
}
Run Code Online (Sandbox Code Playgroud)


R S*_*ahu 8

你声明vectorCustom在线S

   vector<Custom> MyWonderfulVector;
Run Code Online (Sandbox Code Playgroud)

但它是空的vector.里面没有物品.当您尝试访问的元素vectorfor循环中,您正在访问的vector用出界指数.

我可以想到以下选项来解决这个问题.

  1. vector使用初始大小创建.

     vector<Custom> MyWonderfulVector(10);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 加入到vectorfor环.

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

    }