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

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

1.初始化容器

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

2.复制容器元素

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

3.插入元素

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

4.删除元素

deque deq = {1, 2, 3, 4, 5};
deq.assign(deq.begin(), deq.end() - 2); // 删除末尾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;
}

在这里插入图片描述

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐