C++ 创建大小元素的向量,而不调用复制构造函数?

C++ 创建大小元素的向量,而不调用复制构造函数?,c++,vector,C++,Vector,有没有一种方法可以创建N个元素的向量,而不调用复制构造函数,而是调用元素的默认构造函数?我不想要元素的复制构造函数,因为应该防止复制 在这里,您似乎可以,选项3: 3) 构造带有默认插入实例计数的容器 T.未制作副本 但在这里,您似乎无法: 空容器构造函数(默认构造函数)构造一个没有元素的空容器 fill构造函数用n个元素构造一个容器。每个元素都是val的副本(如果提供) 范围构造函数构造一个容器,其中包含的元素数量与范围[first,last]的元素数量相同,每个元素的位置都是从其 该范围

有没有一种方法可以创建N个元素的向量,而不调用复制构造函数,而是调用元素的默认构造函数?我不想要元素的复制构造函数,因为应该防止复制

在这里,您似乎可以,选项3:

3) 构造带有默认插入实例计数的容器 T.未制作副本

但在这里,您似乎无法:

  • 空容器构造函数(默认构造函数)构造一个没有元素的空容器

  • fill构造函数用n个元素构造一个容器。每个元素都是val的副本(如果提供)

  • 范围构造函数构造一个容器,其中包含的元素数量与范围[first,last]的元素数量相同,每个元素的位置都是从其 该范围内的相应元素,顺序相同

  • 复制构造函数(以及使用分配器复制)以相同的顺序使用x中每个元素的副本构造容器

  • move构造函数(和使用分配器移动)构造一个获取x元素的容器 与x的分配器不同,元素被移动。否则 元素被构造(它们的所有权被直接转移) 处于未指定但有效的状态

  • 初始值设定项列表构造函数使用il中每个元素的副本以相同的顺序构造一个容器


  • 是的,这就是向量的工作原理

    您误读了cplusplus.com的措辞。它说“填充构造函数用n个元素构造一个容器。每个元素都是
    val
    (如果提供)”的副本;您无法摆脱这一点。但您没有提供
    val

    我们可以用以下简单的代码简单地演示,当元素默认构造时,不会(或者至少不需要)创建副本:

    #include <vector>
    #include <iostream>
    
    struct T
    {
        T() { std::cout << "def-cons\n"; }
        ~T() { std::cout << "dest\n"; }
        T(const T&) = delete;
    };
    
    int main()
    {
        std::vector<T> v(5);
    }
    
    #包括
    #包括
    结构T
    {
    
    {:STD::CUT< P>这取决于你使用的C++版本。在C++ 11之前,只有 将元素放入向量的方法是复制:

    std::vector<T> v( 10 );
    
    std::vectorv(10);
    
    相当于:

    std::vector<T> v( 10, T() );
    
    向量v(10,T());
    使用默认的
    T
    复制10次。C++11更改了这一点, 第一个表单需要默认构造
    T
    10次, 没有任何拷贝