跳转到主内容
思享编程网:思考分享,玩转编程世界!

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

什么是 assign?

简单来说,

assign

std::vector

的一个成员函数,它用新内容 替换 向量的所有现有元素。

是的,它不仅仅是在末尾添加,而是完全 重新定义 向量的内容!

为什么需要 assign?

想象一下这些场景: 你需要清空向量并用全新的数据集填充 你想要用多个相同的值快速填充向量 你希望用另一个容器的部分数据来重置当前向量 在这些情况下,

assign

比手动

clear()

然后

push_back()

要高效和简洁得多!

assign 的三种主要形式 让我们通过代码示例来探索

assign

的三种常见用法: 1. 用计数和值填充 🔢

#include

#include

int main() { std::vector 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. 使用迭代器范围 🔄

#include

#include #include

int main() { std::vector target; std::list 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)

#include

#include

int main() { std::vector 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 会: 销毁 所有现有元素 释放 可能不需要的内存(取决于实现) 分配 新内存(如果需要) 构造 新元素 这比手动循环

push_back

更高效,因为 vector 可以预先分配所需的确切内存。

实际应用示例 🚀

#include

#include

class GameManager { private: std::vector 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; } 注意事项 ⚠️ 迭代器失效 :调用

assign

后,所有指向原vector元素的迭代器、指针和引用都会失效 异常安全 :如果元素构造抛出异常,vector 会保持有效但未指定状态 性能 :对于复杂对象类型,

assign

可能比创建新vector并交换效率稍低 总结 ✨

std::vector::assign

是一个强大而多才多艺的工具,让你能够: ✅ 一次性替换所有内容 ✅ 从各种源快速填充数据 ✅ 编写更简洁、更高效的代码 ✅ 避免手动内存管理的复杂性

相关文章