​C++中assign函数的使用

 更新时间:2025年07月14日 10:39:32   作者:红石程序员  
在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价值,感兴趣的可以了解一下

​在 C++ 标准模板库(STL)中,std::vector、std::string、std::list 等容器都提供了 assign 成员函数,用于重新分配容器内容。它比 = 操作符更灵活,支持多种初始化方式。本文将详细介绍 assign 的用法、性能分析及适用场景。

​1.assign的基本功能​

assign 的主要作用是:

  1. 清空容器​:移除所有现有元素。
  2. 重新填充​:用指定的新内容替换原有数据。

​语法

void assign(size_type count, const T& value);  // (1) 填充 n 个相同值
void assign(InputIt first, InputIt last);       // (2) 用迭代器范围赋值
void assign(std::initializer_list<T> ilist);    // (3) 用初始化列表赋值

​2. 具体用法示例​

​​(1) 填充n个相同值

std::vector<int> vec;
vec.assign(5, 100);  // 填充 5 个 100
// vec = {100, 100, 100, 100, 100}

​​(2) 用迭代器范围赋值

std::list<int> source = {1, 2, 3, 4, 5};
std::vector<int> vec;
vec.assign(source.begin(), source.end());  // 复制 list 的内容
// vec = {1, 2, 3, 4, 5}

​​(3) 用初始化列表{...}赋值

std::vector<int> vec;
vec.assign({10, 20, 30});  // 直接赋值初始化列表
// vec = {10, 20, 30}

3.assignvsoperator=

操作功能适用场景
assign支持多种初始化方式(迭代器、初始化列表、填充值)需要动态调整容器内容时
operator=仅支持直接赋值(= 或初始化列表)简单赋值时

示例对比:​

std::vector<int> vec1, vec2;

// 用 assign 赋值
vec1.assign({1, 2, 3});  // 支持初始化列表

// 用 = 赋值
vec2 = {1, 2, 3};        // 仅 C++11 及以上支持

​4. 性能分析​

  • ​时间复杂度​:O(n)(n 为新元素的数量)
  • ​与 clear() + push_back() 的对比​:
    • assign 更高效,因为它是批量操作,而 push_back 可能触发多次内存重分配。
  • ​适用场景​:
    • 需要完全替换容器内容时(如从文件/数据库加载新数据)。
    • 需要从其他容器复制数据时(如 std::list → std::vector)。

5. 其他容器的assign

std::string str;
str.assign(5, 'A');  // "AAAAA"

std::list<int> lst;
lst.assign({10, 20, 30});  // {10, 20, 30}

​6. 实际应用场景​

​​(1) 动态更新容器内容

std::vector<int> loadDataFromDatabase() {
    // 模拟从数据库读取数据
    return {101, 102, 103, 104};
}

int main() {
    std::vector<int> cache;
    cache.assign(loadDataFromDatabase().begin(), loadDataFromDatabase().end());
    // cache = {101, 102, 103, 104}
}

​​(2) 清空并重新填充

std::vector<std::string> logs;

// 清空旧日志,加载新日志
logs.assign({"Error: 404", "Warning: Low memory", "Info: Session started"});

​7. 总结​

特性说明
功能清空容器并用新内容替换
​灵活性​支持迭代器、初始化列表、填充值
​性能​O(n),比 clear() + push_back() 更高效
​适用容器​std::vector, std::string, std::list, std::deque 等

推荐使用场景​:

  • 需要完全替换容器内容时。
  • 需要从其他容器复制数据时。
  • 需要高效初始化大量相同值(如 vec.assign(1000, 0))。

​8. 进一步思考​

  • ​assign 和 resize 的区别:resize 只调整大小,不改变原有数据(除非缩小)。
  • ​assign 和 insert 的区别:insert 是在指定位置插入,而 assign 是先清空再填充。

到此这篇关于​C++中assign函数的使用的文章就介绍到这了,更多相关​C++ assign函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C++实现简单职工管理系统

    C++实现简单职工管理系统

    这篇文章主要为大家详细介绍了C++职工管理系统实训代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • C++动态调用动态链接库(DLL或SO)的方法实现

    C++动态调用动态链接库(DLL或SO)的方法实现

    动态链接库是一种Windows操作系统下常见的可执行文件格式,它包含了一些可被其他应用程序调用的函数和数据,本文主要介绍了C++动态调用动态链接库(DLL或SO),感兴趣的可以了解一下
    2024-01-01
  • C语言实现顺序表的基本操作指南(注释很详细)

    C语言实现顺序表的基本操作指南(注释很详细)

    线性表是最简单的数据结构,而顺序表又是最简单的线性表,其基本思想是用一段地址连续的储存单元依次存储线性表的数据元素,下面这篇文章主要给大家介绍了关于C语言实现顺序表的基本操作,需要的朋友可以参考下
    2021-10-10
  • C++中的六个函数

    C++中的六个函数

    本文给大家介绍了C++中的六个函数,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • C++使用适配器模式模拟实现栈和队列

    C++使用适配器模式模拟实现栈和队列

    不论是C语言还是C++,我们都用其对应的传统写法对栈和队列进行了模拟实现,现在我们要用新的方法模拟实现栈和队列,这个新方法就是适配器模式,文章通过代码示例和图文介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • C++输入流和输出流 超级详细

    C++输入流和输出流 超级详细

    C++ 的开发者认为数据输入和输出的过程也是数据传输的过程,数据像水一样从一个地方流动到另一个地方,所以 C++ 中将此过程称为“流”,实现此过程的类称为“流类”。下面小编将详细介绍这个话题,需要的朋友可以参考一下
    2021-09-09
  • 详解C++中赋值和输入输出语句的用法

    详解C++中赋值和输入输出语句的用法

    这篇文章主要介绍了详解C++中赋值和输入输出语句的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • vector, list, map在遍历时删除符合条件的元素实现方法

    vector, list, map在遍历时删除符合条件的元素实现方法

    下面小编就为大家带来一篇vector, list, map在遍历时删除符合条件的元素实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言SetConsoleCursorInfo函数使用方法

    C语言SetConsoleCursorInfo函数使用方法

    这篇文章介绍了C语言SetConsoleCursorInfo函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • c语言的指针数组详解

    c语言的指针数组详解

    这篇文章主要为大家介绍了c语言的指针数组,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12

最新评论