?C++中assign函數(shù)的使用
?在 C++ 標(biāo)準(zhǔn)模板庫(STL)中,std::vector、std::string、std::list 等容器都提供了 assign 成員函數(shù),用于重新分配容器內(nèi)容。它比 = 操作符更靈活,支持多種初始化方式。本文將詳細(xì)介紹 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()); // 復(fù)制 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. 性能分析?
- ?時間復(fù)雜度?:O(n)(n 為新元素的數(shù)量)
- ?與 clear() + push_back() 的對比?:
- assign 更高效,因為它是批量操作,而 push_back 可能觸發(fā)多次內(nèi)存重分配。
- ?適用場景?:
- 需要完全替換容器內(nèi)容時(如從文件/數(shù)據(jù)庫加載新數(shù)據(jù))。
- 需要從其他容器復(fù)制數(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. 實際應(yīng)用場景?
??(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. 總結(jié)?
| 特性 | 說明 |
|---|---|
| ?功能? | 清空容器并用新內(nèi)容替換 |
| ?靈活性? | 支持迭代器、初始化列表、填充值 |
| ?性能? | O(n),比 clear() + push_back() 更高效 |
| ?適用容器? | std::vector, std::string, std::list, std::deque 等 |
?推薦使用場景?:
- 需要完全替換容器內(nèi)容時。
- 需要從其他容器復(fù)制數(shù)據(jù)時。
- 需要高效初始化大量相同值(如 vec.assign(1000, 0))。
?8. 進(jìn)一步思考?
- ?assign 和 resize 的區(qū)別:resize 只調(diào)整大小,不改變原有數(shù)據(jù)(除非縮?。?/li>
- ?assign 和 insert 的區(qū)別:insert 是在指定位置插入,而 assign 是先清空再填充。
到此這篇關(guān)于?C++中assign函數(shù)的使用的文章就介紹到這了,更多相關(guān)?C++ assign函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++?Qt數(shù)據(jù)庫與SqlTableModel組件應(yīng)用教程
SqlTableModel?組件可以將數(shù)據(jù)庫中的特定字段動態(tài)顯示在TableView表格組件中,這篇文章將主要介紹SqlTableModel組件一些常用的操作,需要的朋友可以參考一下2021-12-12
OpenCV獲取圖像中直線上的數(shù)據(jù)具體流程
對圖像進(jìn)行處理時,經(jīng)常會有這類需求:客戶想要提取出圖像中某條直線或者ROI區(qū)域內(nèi)的感興趣數(shù)據(jù),進(jìn)行重點關(guān)注,怎么操作呢,下面小編通過實例代碼介紹下OpenCV獲取圖像中直線上的數(shù)據(jù),一起看看吧2021-11-11
error LNK2019: 無法解析的外部符號 問題的解決辦法
error LNK2019: 無法解析的外部符號 問題的解決辦法,需要的朋友可以參考一下2013-05-05
C語言實現(xiàn)一個文件版動態(tài)通訊錄流程詳解
這篇文章主要介紹了C語言實現(xiàn)一個文件版動態(tài)通訊錄流程,希望大家能從這篇文章中收獲到許多,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
C數(shù)據(jù)結(jié)構(gòu)之雙鏈表詳細(xì)示例分析
以下是對c語言中的雙鏈表進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-08-08
C語言實現(xiàn)日期和時間處理的常用函數(shù)總結(jié)
在C語言中,時間和日期處理是一項非?;A(chǔ)的技能,也是開發(fā)實際應(yīng)用程序時經(jīng)常會用到的功能,本文為大家總結(jié)了C語言中一些常用的時間庫函數(shù),希望對大家有所幫助2023-06-06

