C++: 一文掌握std::vector::assign函数

什么是 assign?

简单来说,assignstd::vector 的一个成员函数,它用新内容替换 向量的所有现有元素。是的,它不仅仅是在末尾添加,而是完全重新定义向量的内容!

为什么需要 assign?

想象一下这些场景:

  • 你需要清空向量并用全新的数据集填充

  • 你想要用多个相同的值快速填充向量

  • 你希望用另一个容器的部分数据来重置当前向量

在这些情况下,assign 比手动 clear() 然后 push_back() 要高效和简洁得多!

assign 的三种主要形式

让我们通过代码示例来探索 assign 的三种常见用法:

1. 用计数和值填充 🔢

cpp 复制代码
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers;
    
    // 用5个值为42的元素替换当前内容
    numbers.assign(5, 42);
    
    // 输出:42 42 42 42 42
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

适用场景:当你需要用多个相同的值快速初始化或重置向量时。

2. 使用迭代器范围 🔄

cpp 复制代码
#include <vector>
#include <list>
#include <iostream>

int main() {
    std::vector<int> target;
    std::list<int> source = {1, 2, 3, 4, 5};
    
    // 用source列表的内容替换target向量的内容
    target.assign(source.begin(), source.end());
    
    // 输出:1 2 3 4 5
    for (int num : target) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

强大之处 :可以从任何容器(甚至是数组)复制数据,只要提供有效的迭代器范围!

3. 使用初始化列表 🆕 (C++11)

cpp 复制代码
#include <vector>
#include <iostream>

int main() {
    std::vector<std::string> words;
    
    // 用初始化列表直接替换内容
    words.assign({"Hello", "World", "C++", "Rocks!"});
    
    // 输出:Hello World C++ Rocks!
    for (const auto& word : words) {
        std::cout << word << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

现代C++风格:简洁直观,特别适合硬编码数据或测试。

assign 的幕后工作 🎭

当你调用 assign 时,vector 会:

  1. 销毁所有现有元素

  2. 释放可能不需要的内存(取决于实现)

  3. 分配新内存(如果需要)

  4. 构造新元素

这比手动循环 push_back 更高效,因为 vector 可以预先分配所需的确切内存。

实际应用示例 🚀

cpp 复制代码
#include <vector>
#include <iostream>

class GameManager {
private:
    std::vector<int> playerScores;
    
public:
    void resetScores(int playerCount, int initialScore = 0) {
        playerScores.assign(playerCount, initialScore);
    }
    
    void updateScoresFromArray(const int* newScores, size_t size) {
        playerScores.assign(newScores, newScores + size);
    }
    
    void displayScores() {
        for (size_t i = 0; i < playerScores.size(); ++i) {
            std::cout << "Player " << (i + 1) << ": " << playerScores[i] << std::endl;
        }
    }
};

int main() {
    GameManager manager;
    
    // 重置为3个玩家,分数为0
    manager.resetScores(3);
    manager.displayScores();
    
    std::cout << "--- 更新分数后 ---" << std::endl;
    
    // 从数组更新分数
    int newScores[] = {100, 85, 92, 78};
    manager.updateScoresFromArray(newScores, 4);
    manager.displayScores();
    
    return 0;
}

注意事项 ⚠️

  1. 迭代器失效 :调用 assign 后,所有指向原vector元素的迭代器、指针和引用都会失效

  2. 异常安全:如果元素构造抛出异常,vector 会保持有效但未指定状态

  3. 性能 :对于复杂对象类型,assign 可能比创建新vector并交换效率稍低

总结 ✨

std::vector::assign 是一个强大而多才多艺的工具,让你能够:

✅ 一次性替换所有内容

✅ 从各种源快速填充数据

✅ 编写更简洁、更高效的代码

✅ 避免手动内存管理的复杂性

相关推荐
2601_962071577 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水9 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero9 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-10 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
黑马程序员毕设12 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
_Twink1e13 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心13 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长13 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
dong_junshuai13 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
源代码•宸14 小时前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang