【问题标题】:Vector of object from a custom class来自自定义类的对象向量
【发布时间】:2025-11-27 08:25:02
【问题描述】:

在 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 是一个整数,computation1() 也是。在第一次迭代中, i=0 所以应该没问题。奇怪的是,在代码的其他地方,我有另一个类的向量(包含在库中),这种语法适用于它,所以我不明白为什么它在这里不起作用。

编辑:

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

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

【问题讨论】:

  • 你的MyWonderfulVector 有对象吗?您需要通过push_back 操作将对象分配给向量。您是否在未显示的代码中这样做了?
  • 我怀疑some_variable &gt; MyWonderfulVector.size()。您的问题可能在// Some code// 的某个地方。
  • 不,它是空的。我想做的是:“vector MyIntVector”
  • 然后给它一个大小,比如vector&lt;Custom&gt; MyWonderfulVector(some_variable);。即使是 int 情况,它也是未定义的行为。
  • @Doombot 你可以使用resize来设置vector的大小。

标签: c++ class vector


【解决方案1】:

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

【讨论】:

  • 他没有向向量中添加项目,而是在i 处获取对对象的引用并将值分配给其中一个成员。
  • @Stormenet 除非i 没有对象怎么办?然后你会得到一个vector subscript out of range 异常。
  • @sjdowling 除非您使用.at(i) 而不是[i],否则您不会得到任何此类异常。如果您使用operator[] 方法获取或设置超出范围的元素,这只是未定义的行为。
  • @cdhowie 根据标准并处于发布模式。然而,大多数实现都会在 Debug 中对 operator [] 进行边界检查,这正是 Doombot 所看到的。
  • 没错,我是在 MSVS C++ 的调试模式下。
【解决方案2】:

我之前也遇到过同样的问题。我尝试使用矢量类中的 push_back 函数并且它有效。也许它会解决你的问题

【讨论】:

    【解决方案3】:

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

    vector<Custom> MyWonderfulVector;
    

    如果你调用它的成员函数emptylike

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

    【讨论】:

    • 哈哈哈这正是我要做的。谢谢!
    • 所以储备是预分配内存。好的,我会补充的!
    • @Doombot 你是对的。 Reserve 为将来可以通过 push_back 添加的元素预分配内存
    • @@Doombot 考虑到您可以在不保留内存的情况下使用 push_back。但是在这种情况下,每次添加新元素时都会重新分配内存。因此,保留不会重新分配的内存会更有效。
    • “但是在这种情况下,每次添加新元素时都会重新分配内存” 嗯?从什么时候开始?
    【解决方案4】:

    您在该行中声明了Customs 中的vector

       vector<Custom> MyWonderfulVector;
    

    但它是一个空的vector。里面没有项目。当您尝试在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);
      

      }

    【讨论】:

      【解决方案5】:

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

      这是一种方法。

      【讨论】:

        最近更新 更多