• 力扣C++学习笔记——C++ assign全面解析


    c++assign是一个C++20标准中新增的头文件,主要提供了assign函数,用于将一个容器内的元素按照特定规则赋值到另一个容器中。它是STL容器操作的重要一环,具有高效、简洁、易用的特点。

    assign函数有多个版本,一般使用的是容器类型相同或相似的版本。使用起来非常方便,只需一行代码即可完成多种常见操作。
    二、常用操作
    assign函数的常用操作包括:

    1.初始化容器

    // 初始化vector容器为10个0
    vector vec(10);
    vec.assign(10, 0); // 初始化为10个0
    
    • 1
    • 2
    • 3

    2.复制容器元素

    vector vec1 = {1, 2, 3, 4, 5};
    vector vec2;
    vec2.assign(vec1.begin()+2,vec1.begin()+5);; // 复制vec1的3~5元素到vec2
    
    • 1
    • 2
    • 3

    3.插入元素

    vector vec = {1, 2, 3, 4, 5};
    vec.assign({6, 7, 8}); // 插入3个元素,等价于vec={6, 7, 8}
    
    • 1
    • 2

    4.删除元素

    deque deq = {1, 2, 3, 4, 5};
    deq.assign(deq.begin(), deq.end() - 2); // 删除末尾2个元素
    
    • 1
    • 2

    三、注意事项
    使用assign函数时需要注意以下几点:

    • 1.容器类型必须相同或相容
      assign函数只能用于容器类型相同或相容的场合。

    • 2.元素的赋值方式
      assign函数将元素赋值到目标容器中,因此需要注意元素的赋值方式。如果目标容器元素类型为类对象,则需要在类中定义赋值运算符。

    • 3.对非序列容器的限制
      assign函数对于非序列容器(如map、set等)只能使用初始化列表进行赋值。

    四、示例代码

     
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
        std::vector<int> vec1 = {1, 2, 3, 4, 5};
        std::cout << "vec1:";
        for (auto vec : vec1)
        {
            std::cout << vec << " ";
        }
        std::cout << std::endl;
        // 初始化为10个5,直接会覆盖上面已经初始化的数据
        vec1.assign(10, 5);
        std::cout << "vec1:";
        for (auto vec : vec1)
        {
            std::cout << vec << " ";
        }
        std::cout << std::endl;
    
        // 复制vec1的3~5元素到vec2
        std::vector<int> vec2;
        vec2.assign(vec1.begin() + 2, vec1.begin() + 5);
    
        std::cout << "vec2:";
        for (auto vec : vec2)
        {
            std::cout << vec << " ";
        }
        std::cout << std::endl;
        vector<int> vec3;
        vec3.assign(vec1.begin() + 2, vec1.end());
        std::cout << "vec3:";
        for (auto vec : vec3)
        {
            std::cout << vec << " ";
        }
        std::cout << std::endl;
        // 插入3个元素,等价于vec1={6, 7, 8}
        vec1.assign({6, 7, 8});
        std::cout << "vec1:";
        for (auto vec : vec1)
        {
            std::cout << vec << " ";
        }
        std::cout << std::endl;
        // 删除末尾2个元素
        deque<int> deq(vec1.begin(), vec1.end());
        deq.assign(deq.begin(), deq.end() - 2);
        std::cout << "deq ";
        for (auto it : deq)
        {
            std::cout << it << " ";
        }
        std::cout << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    在这里插入图片描述

    C++中的std::deque(双端队列)和std::vector(向量)区别

    C++中的std::deque(双端队列)和std::vector(向量)是两种不同的容器类型,它们有以下区别:

    内部实现方式不同:std::deque使用了一种双端队列的数据结构,它由多个块(chunks)组成,每个块内部存储一部分元素。而std::vector则使用了连续的内存块来存储元素。

    随机访问性能不同:由于std::vector的元素在内存中是连续存储的,因此它支持高效的随机访问,可以通过索引直接访问任意位置的元素。而std::deque虽然也支持随机访问,但由于元素分布在多个块中,访问不同位置的元素可能需要更多的指针操作,因此相对于std::vector,其随机访问的性能稍差一些。

    插入和删除操作性能不同:std::deque在两端进行插入和删除操作的性能较好,因为它可以在常数时间内在两端进行操作。而std::vector在尾部进行插入和删除操作的性能也很好,但在中间或头部进行插入和删除操作时,需要移动后续元素,因此性能较差。

    内存管理方式不同:std::deque相对于std::vector具有更高的内存开销,因为它需要为每个块分配额外的内存空间。而std::vector则在内存中分配一块连续的内存来存储元素,可以更有效地利用内存。

    综上所述,选择使用std::deque还是std::vector取决于具体的使用场景和需求。如果需要频繁在两端进行插入和删除操作,或者不需要频繁的随机访问,std::deque可能是一个更好的选择。如果需要高效的随机访问和在尾部进行插入和删除操作,std::vector可能更适合。

    参考:
    https://blog.csdn.net/weixin_36670529/article/details/132767601

  • 相关阅读:
    第18章_MySQL8新特性之CTE(公用表表达式)
    [CF643F]Bears and Juice
    Morgan Stanley面经
    持续测试(Continuous Testing)
    一文1800字从0到1使用Python Flask实战构建Web应用
    机器学习初学者不可错过的ModelScope开源模型社区
    PHP + Laravel + RabbitMQ + Redis 实现消息队列 (二) 消费队列在RabbitMQ和redis中的简单使用
    学成在线-网站搭建
    Linux系统编程(二):文件和目录
    2023年全网最全的软件测试八股文,稳进大厂(含答案)
  • 原文地址:https://blog.csdn.net/mao_hui_fei/article/details/134490289