C++ C++;目标向量
我对创建对象向量比较陌生。下面是我的对象在我之前使用的代码,包括保持向量:C++ C++;目标向量,c++,vector,C++,Vector,我对创建对象向量比较陌生。下面是我的对象在我之前使用的代码,包括保持向量: class obj { public: int* arr; obj(int x) { arr = new int[x]; } ~obj() { delete[] arr; } // All functionality stripped for clarity }; 我现在想创建一个向量来保存所有创建的对象。我尝试的是创建一个向量,并将新创建
class obj {
public:
int* arr;
obj(int x) {
arr = new int[x];
}
~obj() {
delete[] arr;
}
// All functionality stripped for clarity
};
我现在想创建一个向量来保存所有创建的对象。我尝试的是创建一个向量,并将新创建的对象推入其中,如下所示:
std::vector<obj> objVector;
objVector.push_back(obj(5));
objVector.push_back(obj(8));
std::vector objVector;
objVector.push_back(obj(5));
推回(obj(8));
上述情况会导致错误,其中未创建arr
,并且是空指针。我在这个网站的其他地方看到的建议是包括一个拷贝创建者,以方便复制。因此,我有以下问题:
- 使用上述push_-back代码将创建两个对象(临时对象和向量对象),或者将一个对象直接创建到向量中
- 我必须在副本创建者中包括什么,我必须为第二个对象创建一个新的
,或者我可以将其传递到第二个对象上arr
大家好,我不得不编辑这个,因为它已被标记为重复。请注意,我知道三/五的规则,并暗示我知道我需要包括上述内容。事实上,我在要点中提出的问题是关于向量如何处理和推动的对象 这会创建一个临时对象并运行它吗?构造函数然后将该临时对象复制到向量中。或者相反,它直接创建向量中的对象 正如下面所评论的,将对象放置到向量中似乎可以避免使用复制函数,因为它似乎可以直接创建对象。我知道我仍然需要实现规则,我只是想了解标准化代码在做什么以及它是如何工作的。您需要一个新的规则,并保留数组的大小。看著名的 附言。
没有必要对聪明的指针如此武断。它们有帮助,但我们在没有它们的情况下生存了30年。既然你不反对使用标准库,那么放弃
新建和删除而代之以std::vector
怎么样?这完全可以避免您的问题。零是中的首选选项。您可以使用objVector.emplace\u back(5)
这将在适当的位置创建对象,而不是推回。@user10052900-什么开销?您正在进行过早的优化。在这种情况下,您仍然有std::unique_ptr
。可能重复,请注意,析构函数中不需要检查非空arr<代码>删除[]
将在尝试取消分配之前检查空指针本身。
class obj {
public:
int* arr;
const size_t size;
obj(const obj& other)
:size(other.size)
{
arr = new int[size];
std::copy(other.arr,other.arr+size,arr);
}
obj& operator=(const obj&) = delete; // unclear what to do if size!=other.size
obj& operator=(obj&&) = delete; // unclear what to do if size!=other.size
obj(obj&& other)
:size(other.size)
{
arr = other.arr;
other.arr=nullptr;
}
obj(size_t x)
:size(x)
{
assert(x>0);
arr = new int[x];
}
~obj() {
if(arr)
delete[] arr;
}
// All functionality stripped for clarity
};