?C++中assign函數(shù)的使用
?在 C++ 標準模板庫(STL)中,std::vector、std::string、std::list 等容器都提供了 assign 成員函數(shù),用于重新分配容器內(nèi)容。它比 = 操作符更靈活,支持多種初始化方式。本文將詳細介紹 assign 的用法、性能分析及適用場景。
?1.assign的基本功能?
assign 的主要作用是:
- ?清空容器?:移除所有現(xiàn)有元素。
- ?重新填充?:用指定的新內(nèi)容替換原有數(shù)據(jù)。
?語法
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 的內(nèi)容 // vec = {1, 2, 3, 4, 5}
??(3) 用初始化列表{...}賦值
std::vector<int> vec; vec.assign({10, 20, 30}); // 直接賦值初始化列表 // vec = {10, 20, 30}
3.assignvsoperator=
操作 | 功能 | 適用場景 |
---|---|---|
assign | 支持多種初始化方式(迭代器、初始化列表、填充值) | 需要動態(tài)調(diào)整容器內(nèi)容時 |
operator= | 僅支持直接賦值(= 或初始化列表) | 簡單賦值時 |
?示例對比:?
std::vector<int> vec1, vec2; // 用 assign 賦值 vec1.assign({1, 2, 3}); // 支持初始化列表 // 用 = 賦值 vec2 = {1, 2, 3}; // 僅 C++11 及以上支持
?4. 性能分析?
- ?時間復雜度?:O(n)(n 為新元素的數(shù)量)
- ?與 clear() + push_back() 的對比?:
- assign 更高效,因為它是批量操作,而 push_back 可能觸發(fā)多次內(nèi)存重分配。
- ?適用場景?:
- 需要完全替換容器內(nèi)容時(如從文件/數(shù)據(jù)庫加載新數(shù)據(jù))。
- 需要從其他容器復制數(shù)據(jù)時(如 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) 動態(tài)更新容器內(nèi)容
std::vector<int> loadDataFromDatabase() { // 模擬從數(shù)據(jù)庫讀取數(shù)據(jù) 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. 總結?
特性 | 說明 |
---|---|
?功能? | 清空容器并用新內(nèi)容替換 |
?靈活性? | 支持迭代器、初始化列表、填充值 |
?性能? | O(n),比 clear() + push_back() 更高效 |
?適用容器? | std::vector, std::string, std::list, std::deque 等 |
?推薦使用場景?:
- 需要完全替換容器內(nèi)容時。
- 需要從其他容器復制數(shù)據(jù)時。
- 需要高效初始化大量相同值(如 vec.assign(1000, 0))。
?8. 進一步思考?
- ?assign 和 resize 的區(qū)別:resize 只調(diào)整大小,不改變原有數(shù)據(jù)(除非縮?。?。
- ?assign 和 insert 的區(qū)別:insert 是在指定位置插入,而 assign 是先清空再填充。
到此這篇關于?C++中assign函數(shù)的使用的文章就介紹到這了,更多相關?C++ assign函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++動態(tài)調(diào)用動態(tài)鏈接庫(DLL或SO)的方法實現(xiàn)
動態(tài)鏈接庫是一種Windows操作系統(tǒng)下常見的可執(zhí)行文件格式,它包含了一些可被其他應用程序調(diào)用的函數(shù)和數(shù)據(jù),本文主要介紹了C++動態(tài)調(diào)用動態(tài)鏈接庫(DLL或SO),感興趣的可以了解一下2024-01-01vector, list, map在遍歷時刪除符合條件的元素實現(xiàn)方法
下面小編就為大家?guī)硪黄獀ector, list, map在遍歷時刪除符合條件的元素實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12C語言SetConsoleCursorInfo函數(shù)使用方法
這篇文章介紹了C語言SetConsoleCursorInfo函數(shù)的使用方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-12-12