在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到向量中。如果其中一位评论者希望将其纳入答案......
答案 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
。
我可以考虑以下选项来解决这个问题。
使用初始尺寸创建vector
。
vector<Custom> MyWonderfulVector(10);
添加到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);
}
这是一种方法。