最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一起來學習C++中remove與erase的理解

 更新時間:2022年03月09日 16:18:15   作者:Giant NG  
這篇文章主要為大家詳細介紹了C++的remove與erase,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

erase 簡介

vector 中 erase 函數(shù)原型如下:

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

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

在刪除一個元素的時候,其參數(shù)為指向相應(yīng)元素的迭代器;而在刪除一段元素的時候,參數(shù)為指向一段元素的開頭的迭代器以及指向結(jié)尾元素的下一個元素的迭代器。

調(diào)用 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已經(jīng)指向了新的下一個元素;如果不執(zhí)行itr--與itr++做抵消,則會超出end導(dǎo)致崩潰。
			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 函數(shù)是由 STL 庫中 algorithm 提供的一個函數(shù),這里的 remove 字面意思很容易引起初學者誤解。因為調(diào)用以后并非真實的 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

代碼分析

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

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

remove 是如何工作的?

查找資料后發(fā)現(xiàn),remove 和 erase 存在很大的區(qū)別。

remove 是 algorithm 的模板函數(shù),它接收的都是迭代器參數(shù),并不接收某個容器。remove 并不知道它作用于哪個容器,也不可能發(fā)現(xiàn)容器,因為沒有辦法從一個迭代器獲得對應(yīng)于它的容器。

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

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

remove 的工作流程

在這里插入圖片描述

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

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

再來看 remove(3) 的過程:

在這里插入圖片描述

至此,大概可以弄清楚 remove 這個函數(shù)對一個 vector 做了哪些操作,改變了哪些元素的順序,以及返回值是指向何處。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實例

    QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實例

    下面小編就為大家?guī)硪黄猀T網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解分析

    C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解分析

    鏈表可以說是一種最為基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)了,而單向鏈表更是基礎(chǔ)中的基礎(chǔ)。鏈表是由一組元素以特定的順序組合或鏈接在一起的,不同元素之間在邏輯上相鄰,但是在物理上并不一定相鄰。在維護一組數(shù)據(jù)集合時,就可以使用鏈表,這一點和數(shù)組很相似
    2021-11-11
  • C語言數(shù)據(jù)結(jié)構(gòu)樹之后序遍歷的實現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)樹之后序遍歷的實現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之后序遍歷的實現(xiàn)的相關(guān)資料,這里提供一個簡單實例來實現(xiàn)后續(xù)遍歷,對于數(shù)據(jù)結(jié)構(gòu)樹的學習很有幫助,需要的朋友可以參考下
    2017-07-07
  • 基于C語言實現(xiàn)簡單的五子棋游戲

    基于C語言實現(xiàn)簡單的五子棋游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)簡單的五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • c++插入排序詳解

    c++插入排序詳解

    插入排序的基本思想是每次將一個待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子文件中的適當位置,直到全部記錄插入完成為止。下面我們來詳細探討下C++實現(xiàn)插入排序
    2017-05-05
  • C/C++實現(xiàn)內(nèi)存泄漏檢測詳解

    C/C++實現(xiàn)內(nèi)存泄漏檢測詳解

    這篇文章主要為大家詳細介紹了c++進行內(nèi)存泄漏檢測的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2023-02-02
  • C語言可變參數(shù)列表的用法與深度剖析

    C語言可變參數(shù)列表的用法與深度剖析

    這篇文章主要給大家介紹了關(guān)于C語言可變參數(shù)列表的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-02-02
  • 將Deepseek接入本地Vscode的圖文步驟

    將Deepseek接入本地Vscode的圖文步驟

    本文主要介紹了將Deepseek接入本地Vscode的圖文步驟,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • C++ opencv實現(xiàn)的把藍底照片轉(zhuǎn)化為白底照片功能完整示例

    C++ opencv實現(xiàn)的把藍底照片轉(zhuǎn)化為白底照片功能完整示例

    這篇文章主要介紹了C++ opencv實現(xiàn)的把藍底照片轉(zhuǎn)化為白底照片功能,結(jié)合完整實例形式詳細分析了C++使用opencv模塊進行圖片轉(zhuǎn)換操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • C++實現(xiàn)智能柜管理系統(tǒng)

    C++實現(xiàn)智能柜管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)智能柜管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

黄骅市| 三江| 板桥市| 丰原市| 丰顺县| 桓台县| 财经| 江阴市| 岚皋县| 海盐县| 泗水县| 合肥市| 宜宾县| 阿合奇县| 平塘县| 营口市| 白玉县| 南皮县| 泽库县| 开封市| 荃湾区| 晴隆县| 唐河县| 安吉县| 仪征市| 余干县| 农安县| 马鞍山市| 建平县| 克什克腾旗| 邵东县| 荔波县| 唐河县| 绥滨县| 当雄县| 刚察县| 于田县| 专栏| 鲁山县| 永年县| 米易县|