自定义类中对象的矢量
Vector of object from a custom class
在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()
也是int。在第一次迭代时,i=0,所以应该没问题。奇怪的是,在代码的其他地方,我有另一个类的向量(包含在库中),这种语法适用于它,所以我不明白为什么它在这里不起作用。
编辑:
好的,有了评论,我改成了下面一行:向量MyWonderfulVector(10);
所以我的问题是我没有初始化向量的大小(Matlab的坏习惯;))根据我的理解,如果我没有将向量初始化为固定大小,我必须将对象推回以"增加"向量的大小。因此,我应该创建一个临时的自定义对象来分配字段,然后将这个临时对象推回到向量中。如果有一个评论者想把这个变成一个答案。。。
您定义了一个没有元素的向量
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 );
}
在行中声明Custom
s的vector
vector<Custom> MyWonderfulVector;
但是它是空的CCD_ 12。其中没有项目。当您尝试在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);
}
我以前也遇到过同样的问题。我试着使用向量类中的push_back函数,它成功了。也许它可以解决您的问题
矢量与数组不同。您需要使用push_back
在访问元素之前尝试使用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);
}
这是一种方法。
- 自定义对象的dlib序列化在gcc中失败
- 如何将带有自定义对象的容器从C++传递到QML
- 将 exprtk 与自定义类的对象一起使用
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 如何实现自定义匹配器以检查 Catch2 中的对象相等性
- 如何使用Q_PROPERTY公开自定义对象列表
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 从自定义类获取对象向量中的 max 元素
- 如何将来自 Boost.Python 的map_indexing_suite与自定义而不是标准对象一起使用?
- 如何在自定义对象的<<运算符中添加自定义前缀
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 如何从 cpp 中的函数返回自定义类对象?
- 如何为自定义模板对象创建专门的函数模板
- 带有自定义deleter的std::unique_ptr对象的大小(一个由ref捕获的lambda)
- 基于3个对象的自定义排序
- 如何键入用于const对象的自定义io操纵器
- 指向临时对象的自定义迭代器(延迟加载)
- 将自定义对象作为参数从目标 C 传递到 C++
- 从 Arduino 中的自定义C++库构造对象时出错
- 从链表访问对象(自定义实现)