Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;目标向量_C++_Vector - Fatal编程技术网

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