当前位置:   article > 正文

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

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 <iostream>
#include <vector>
#include <deque>
#include <algorithm>
#include <unordered_map>
#include <string>

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/566621
推荐阅读
相关标签
  

闽ICP备14008679号