亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中remove與erase實例分析

發布時間:2022-03-10 09:10:36 來源:億速云 閱讀:96 作者:iii 欄目:開發技術

本篇內容介紹了“C++中remove與erase實例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    erase 簡介

    vector 中 erase 函數原型如下:

    iterator erase(
        const_iterator position);
    iterator erase(
        const_iterator first,
        const_iterator last);

    用于刪除 vector 容器中的一個或者一段元素

    在刪除一個元素的時候,其參數為指向相應元素的迭代器;而在刪除一段元素的時候,參數為指向一段元素的開頭的迭代器以及指向結尾元素的下一個元素的迭代器

    調用 erase 后,vector 元素會向前移,因此需要格外注意這個特征,避免越界訪問以及漏處理。

    示例代碼:

    int main(int argc, char *argv[])
    {
    	vector<int> myVector;
    	myVector.push_back(1);
    	myVector.push_back(2);
    	myVector.push_back(3);
    	myVector.push_back(3);
    	myVector.push_back(3);
    	myVector.push_back(4);
    	myVector.push_back(3);
    	myVector.push_back(3);
    	myVector.push_back(3);
    	for (vector<int>::iterator itr = myVector.begin(); itr != myVector.end(); itr++) {
    		if (*itr == 3) {
    			//此時itr已經指向了新的下一個元素;如果不執行itr--與itr++做抵消,則會超出end導致崩潰。
    			itr = myVector.erase(itr);
    			itr--;
    		}
    	}
    	cout << "[After erase] myVector: ";
    	for (int temp : myVector)
    		cout << temp << " ";
    	cout << endl;
    	return 0;
    }

    remove 簡介

    algorithm 中 remove 原型如下:

    template<class ForwardIterator, class Type>
    ForwardIterator remove(
        ForwardIterator first,
        ForwardIterator last,
        const Type& value);
    template<class ExecutionPolicy, class ForwardIterator, class Type>
    ForwardIterator remove(
        ExecutionPolicy&& exec,
        ForwardIterator first,
        ForwardIterator last,
        const Type& value);

    remove 函數是由 STL 庫中 algorithm 提供的一個函數,這里的 remove 字面意思很容易引起初學者誤解。因為調用以后并非真實的 remove

    代碼示例

    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main(int argc, char *argv[])
    {
    	vector<int> array;
    	array.push_back(1);
    	array.push_back(2);
    	array.push_back(3);
    	array.push_back(3);
    	array.push_back(4);
    	array.push_back(5);
    	cout << "init : ";
    	print(array);
    	array.erase(array.begin());
    	cout << "erase array.begin() :";
    	print(array);
    	vector<int>::iterator remove2It = remove(array.begin(), array.end(), 2);
    	cout << "remove 2 : ";
    	print(array);
    	cout << "remove2It traverse : ";
    	for (; remove2It != array.end(); remove2It++)
    		cout << *remove2It << " ";
    	cout << endl;
    	vector<int>::iterator remove3It = remove(array.begin(), array.end(), 3);
    	cout << "remove 3 : ";
    	print(array);
    	cout << "remove3It traverse : ";
    	for (; remove3It != array.end(); remove3It++)
    		cout << *remove3It << " ";
    	cout << endl;
    	return 0;
    }

    運行后打印如下:

    init : 1 2 3 3 4 5
    erase array.begin() :2 3 3 4 5
    remove 2 : 3 3 4 5 5
    remove2It traverse : 5
    remove 3 : 4 5 5 5 5
    remove3It traverse : 5 5

    代碼分析

    如上所示,執行 array.erase(array.begin()); 后,符合預期地將第一個元素刪除了,打印結果為:erase array.begin() : 2 3 3 4 5

    在此基礎(2 3 3 4 5)上執行 remove(array.begin(), array.end(), 2);,可能慣性思維會覺得得到的結果(這個是錯誤的結果,效果就像調用了 erase 一樣)應該是 3 3 4 5,4 個元素。而實際打印結果為:3 3 4 5 5,5 個元素。這里完全“顛覆”了對 remove 這一字義的認識。

    remove 是如何工作的?

    查找資料后發現,remove 和 erase 存在很大的區別。

    remove 是 algorithm 的模板函數,它接收的都是迭代器參數,并不接收某個容器。remove 并不知道它作用于哪個容器,也不可能發現容器,因為沒有辦法從一個迭代器獲得對應于它的容器。

    想要從容器中刪除一個元素,唯一的方法就是調用容器的一個成員函數,比如 erase 函數。而 remove 無法知曉,故不可能根據一個傳進來的迭代器進而在該容器中除去元素。因此,調用 remove 后并不會改變該容器的元素個數

    得出的結論是:remove 并不是真的在刪除元素,因為它根本做不到

    remove 的工作流程

    C++中remove與erase實例分析

    (注意:begin 與 end 是左閉右開區間,即 end 是 vector 之外了,即 vector 最后一個元素的下一個。)

    這里需要明確一點是,remove() 的返回值是一個 iterator

    再來看 remove(3) 的過程:

    C++中remove與erase實例分析

    “C++中remove與erase實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    康保县| 桃江县| 北川| 礼泉县| 盘锦市| 赤峰市| 胶州市| 清水河县| 来安县| 彰武县| 青河县| 东乡族自治县| 扎鲁特旗| 祥云县| 高碑店市| 永兴县| 尼勒克县| 芜湖县| 武穴市| 澄江县| 阿尔山市| 监利县| 都江堰市| 正定县| 闻喜县| 开封县| 宣城市| 邓州市| 调兵山市| 闽侯县| 霍林郭勒市| 宁化县| 杨浦区| 新晃| 康定县| 荣成市| 本溪| 岑巩县| 建宁县| 玛沁县| 洪洞县|