为什么当我使用 Vector 时,push_back的每个元素都会调用 Copy 构造函数?[复制]

why is copy constructor called for every element of vector when i use push_back? [duplicate]

提问人:Russell Butler 提问时间:1/18/2023 更新时间:1/18/2023 访问量:58

问:

我正在做这个练习,其中我实现了一个包含动态分配的内置数组 (int*) 的类。我正在尝试实现 Big 5,我认为它正在工作(无论如何它都会编译和运行),但是每次我向包含我的类类型对象的向量添加新元素时(参见 main),它似乎都会在向量中的所有元素上调用复制构造函数!(请参阅下面的输出)。

这是 C++ 向量的正常行为,还是我做错了什么?谢谢

class LargeTypeRaw
{
public:

     LargeTypeRaw(size_t initialSize = 10)
        : data{ new int[size] }, size{ initialSize }
     {
         std::cout << "normal constructor called" << std::endl;        
     }

     LargeTypeRaw(const LargeTypeRaw& other)
         : size{ other.size }, data{ new int[other.size]}
     {
         std::copy(other.data, other.data + other.size, data); 
         std::cout << "copy constructor called" << std::endl; 
     }

     LargeTypeRaw(LargeTypeRaw&& other)
         : size{ other.size }, data{ other.data }
     {
         std::cout << "move constructor called" << std::endl; 
         other.data = nullptr;
     }

     LargeTypeRaw& operator=(const LargeTypeRaw& other)
     {
         std::cout << "copy assignment operator called" << std::endl; 

         if (&other != this)
         {
             
             delete[] data;
             data = new int[other.size]; 
             std::copy(other.data, other.data+other.size, data); 
         }

         return *this; 
     }

     LargeTypeRaw& operator=(LargeTypeRaw&& other)
     {
         std::cout << "move assignment operator called" << std::endl; 

         if (&other != this)
         {
             delete[] data;
             data = other.data; 
             other.data = nullptr; 
         }

         return *this;   
     }
 
    ~LargeTypeRaw()
    {
        std::cout << "destructor called " << std::endl; 
        delete [] data;
    }

    size_t getSize() const
    {
        return size; 
    }

    bool operator<(const LargeTypeRaw& rhs) const
    {
        return size < rhs.size; 
    }


private:
    int* data;
    size_t size; 
};




int main()
{
    
    //example using LargeTypes that hold int
    std::vector<LargeTypeRaw> vec{};

    for (int i = 0; i < 5; i++)
    {
        size_t size = rand() % 10;
        std::cout << "initializing another object " << std::endl;
        LargeTypeRaw lt{ size }; 
        std::cout << "adding the new object to the vector " << std::endl; 
        vec.push_back(lt);
    }

    
}

enter image description here

C++ 矢量 复制构造函数 move-constructor

评论

0赞 pm100 1/18/2023
因为你正在添加你推送的东西的副本
0赞 Nathan Pierson 1/18/2023
不确定我是否找到了合适的欺骗,但简短的回答是“是的,这是 C++ 向量的正常行为,当它们需要调整大小以将所有存储对象保留在连续的内存区域中时,它们会复制元素”
0赞 Russell Butler 1/18/2023
我明白了,谢谢。所以我想(如果我知道最终大小)我应该用这个容量初始化向量来启动?
1赞 Jarod42 1/18/2023
有些缺少移动而不是复制演示noexcept
1赞 HolyBlackCat 1/18/2023
这与今天的问题惊人地相似。

答: 暂无答案