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