Home Articles

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

Asked
Viewed 920 times
5

在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 range . metric 也是一个int和 computation1() . 在第一次迭代中,i = 0所以它应该没问题 . 奇怪的是,在代码的其他地方,我有另一个类的向量(包含在库中),这个语法适用于它,所以我不在这里工作 .

EDIT :

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

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

5 Answers

  • 8

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

  • 8

    向量不像数组 . 你需要使用push_back

  • 2

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

    vector<Custom> MyWonderfulVector;
    

    如果你调用它的成员函数 empty 就好

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

    那么你会得到 true

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

    您最初可以使用 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

    你在行中声明 CustomCustom

    vector<Custom> MyWonderfulVector;
    

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

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

    • 使用初始大小创建 vector .
    vector<Custom> MyWonderfulVector(10);
    
    • 添加到 for 循环中的 vector .
    for(int i=0 ; i<10 ; i++){
      Custom c;
      c.metric = computation1();
      c.nX= computation2();
      c.nY= computation3();
      MyWonderfulVector.push_back(c);
    

    }

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

    这是一种方法 .

Related