欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中remove與erase區(qū)別小結

 更新時間:2024年08月20日 11:25:01   作者:吃我一個平底鍋  
remove函數和 erase函數都可以實現元素的刪除,本文主要介紹了C++中remove與erase區(qū)別小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

vector中, remove函數和 erase函數都可以實現元素的刪除,但它們的用法稍微有些區(qū)別:

  • erase是刪除指定位置的元素或者指定區(qū)域內的所有元素
  • remove是刪除和指定元素值相同的所有元素(remove需要和erase搭配使用才能實現完整的刪除功能)

erase

erase用于從一個集合中刪除一個元素,但是對于基于數組的容器,如vector,存儲在被刪除元素后的所有元素都需要向前移動以避免集合中有一個空位(gap),在同一容器中多次調用產生了大量移動元素的開銷。并且使用erase之后,后面元素的迭代器都會失效,例如:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

int main() {
	vector<int> vec = { 1,2,3,4,5,6,7 };

	vector<int>::iterator itr = vec.begin();
	for(auto itr=vec.begin();itr!=vec.end();++itr) {
		if (*itr %2 == 1) {
			vec.erase(itr);   
		}
	}
	
	for(auto it=vec.begin();it!=vec.end();++it){
		cout<<*it<<"  ";
	}
	return 0;
}

在這里插入圖片描述

這樣的代碼時無法編譯成功的,因為在erase以后,之后所有的迭代器都失效了,此時會返回一個新的迭代器,我們可以對代碼進行如下修改:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

int main() {
	vector<int> vec = { 1,2,3,4,5,6,7 };

	vector<int>::iterator itr = vec.begin();
	while (itr != vec.end()) {
		if (*itr %2 == 1) {
			itr=vec.erase(itr);   
		}else{
			++itr; 
		}	               
	}
	
	for(auto it=vec.begin();it!=vec.end();++it){
		cout<<*it<<"  ";
	}
	return 0;
}

在這里插入圖片描述

滿足條件的就利用返回的新的迭代器,不滿足條件的直接++;

remove

他們存在于algorithm庫,由于這些算法運行在兩個前向迭代器確定的元素范圍上,它們沒有底層容器或集合的具體知識。并不從容器刪除元素,而是把不符合刪除標準的元素搬移到容器的尾部,并保持這些元素的相對次序,返回指向最后一個元素下一個位置的迭代器。 該算法一次通過數據范圍即可實現該目標。由于沒有元素被刪除,因此不會改變容器的大小和容量。容器尾部的元素都是需要被刪除的,一般remove需要和erase搭配使用才能實現完整的刪除功能。

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> vec{ 1,3,3,4,3,5 };

    auto iter = std::remove(vec.begin(), vec.end(), 3);

    cout << "size is :" << vec.size() << endl;
    cout << "capacity is :" << vec.capacity() << endl;
    
    //輸出迭代器之前的元素 
    for (auto first = vec.begin(); first < iter;++first) {
        cout << *first << " ";
    }
    cout<<endl;
    
    //輸出vec剩余的元素 
    for (auto it = vec.begin(); it != vec.end();++it) {
        cout << *it << " ";
    }
    return 0;
}

在這里插入圖片描述

  • remove() 的實現原理是,在遍歷容器中的元素時,一旦遇到目標元素,就做上標記,然后繼續(xù)遍歷,直到找到一個非目標元素,即用此元素將最先做標記的位置覆蓋掉,同時將此非目標元素所在的位置也做上標記,等待找到新的非目標元素將其覆蓋。因此,如果將上面程序中 demo 容器的元素全部輸出,得到的結果為 1 4 5 4 3 5。
  • 通過remove()并沒有把這些值真正的刪除,需要配合erase來完成刪除操作:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> vec{ 1,3,3,4,3,5 };

    auto iter = std::remove(vec.begin(), vec.end(), 3);

    cout << "原 size is :" << vec.size() << endl;
    cout << "原 capacity is :" << vec.capacity() << endl;
    vec.erase(iter,vec.end()); 
    cout << "刪除后 size is :" << vec.size() << endl;
    cout << "刪除后 capacity is :" << vec.capacity() << endl;
    
    //輸出迭代器之前的元素 
    for (auto first = vec.begin(); first < iter;++first) {
        cout << *first << " ";
    }
    cout<<endl;
    
    //輸出vec剩余的元素 
    for (auto it = vec.begin(); it != vec.end();++it) {
        cout << *it << " ";
    }
    return 0;
}

在這里插入圖片描述

也可以合并進行刪除:

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> vec{ 1,3,3,4,3,5 };

    vec.erase(remove(vec.begin(),vec.end(),3),vec.end());
    cout << "刪除后 size is :" << vec.size() << endl;
    cout << "刪除后 capacity is :" << vec.capacity() << endl;
    
    //輸出vec剩余的元素 
    for (auto it = vec.begin(); it != vec.end();++it) {
        cout << *it << " ";
    }
    return 0;
}

在這里插入圖片描述

補充刪除 vector 容器元素的幾種方式

在這里插入圖片描述

到此這篇關于C++中remove與erase區(qū)別小結的文章就介紹到這了,更多相關C++ remove erase 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • Qt spdlog日志模塊的使用詳解

    Qt spdlog日志模塊的使用詳解

    在Qt應用程序開發(fā)中,良好的日志系統(tǒng)至關重要,本文將介紹如何使用spdlog 1.5.0創(chuàng)建滿足以下要求的日志系統(tǒng),感興趣的朋友一起看看吧
    2025-04-04
  • snprintf函數的用法解析

    snprintf函數的用法解析

    以下是對snprintf函數的具體使用方法進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • C++ 實現自定義類型的迭代器操作

    C++ 實現自定義類型的迭代器操作

    這篇文章主要介紹了C++ 實現自定義類型的迭代器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++ const限定符以及頂層const和底層const的案例詳解

    C++ const限定符以及頂層const和底層const的案例詳解

    這篇文章主要介紹了C++ const限定符以及頂層const和底層const的案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • Qt?加載?libjpeg?庫出現“長跳轉已經運行”錯誤問題解決

    Qt?加載?libjpeg?庫出現“長跳轉已經運行”錯誤問題解決

    這篇文章主要介紹了Qt?加載?libjpeg?庫出現“長跳轉已經運行”錯誤,本文給大家分享完美解決方案,需要的朋友可以參考下
    2023-04-04
  • C語言中sizeof()與strlen()函數的使用入門及對比

    C語言中sizeof()與strlen()函數的使用入門及對比

    這篇文章主要介紹了C語言中sizeof()與strlen()函數的使用入門及對比,同時二者在C++中的使用情況也基本上同理,是需要的朋友可以參考下
    2015-12-12
  • C語言實現學生獎學金評定系統(tǒng)

    C語言實現學生獎學金評定系統(tǒng)

    這篇文章主要介紹了C語言實現學生獎學金評定系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++中進行txt文件讀入和寫入的方法示例

    C++中進行txt文件讀入和寫入的方法示例

    這篇文章主要給大家介紹了C++中進行txt文件讀入和寫入的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • 基于QT制作一個倒計時軟件

    基于QT制作一個倒計時軟件

    這篇文章主要為大家詳細介紹了如何基于QT制作一個簡單的倒計時軟件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • C++數據結構之實現鄰接表

    C++數據結構之實現鄰接表

    這篇文章主要為大家詳細介紹了C++數據結構之實現鄰接表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論