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

C++ vector容器 find erase的使用操作:查找并刪除指定元素

 更新時(shí)間:2021年05月06日 16:20:30   作者:寒泉Hq  
這篇文章主要介紹了C++ vector容器 find erase的使用操作:查找并刪除指定元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

概念:容器、迭代器、算法

STL包括容器、迭代器和算法:

容器

用于管理一些相關(guān)的數(shù)據(jù)類型。每種容器都有它的優(yōu)缺點(diǎn),不同的容器反映出程序設(shè)計(jì)的不同需求。容器自身可能由數(shù)組或鏈表實(shí)現(xiàn),或者容器中的每個(gè)元素都有特殊的關(guān)鍵值。

迭代器

用于遍歷一個(gè)數(shù)據(jù)集中的每個(gè)元素。這些數(shù)據(jù)集可能是容器或者容器的子集。迭代器的主要優(yōu)點(diǎn)是它們?yōu)槿我忸愋偷娜萜魈峁┮粋€(gè)小巧并且通用(注意通用很重要)的接口。例如,迭代器接口的一個(gè)操作是讓它依次遍歷數(shù)據(jù)集的每個(gè)元素。這個(gè)操作是依賴容器的內(nèi)總部結(jié)構(gòu)獨(dú)立完成的。迭代器之所以有效是因?yàn)槿萜黝愄峁┧约旱牡黝愋蛠碜觥罢_的事”,容本身的迭代器了解容器的內(nèi)部結(jié)構(gòu)。

迭代器的接口幾乎相當(dāng)于普通的指針。讓一個(gè)迭代器遞增只需調(diào)用++操作符。使用*操作符可以得到迭代器引用的數(shù)據(jù)值。因而迭代器可以被任為是一種智能指針。

算法

被用于處理數(shù)據(jù)集中的元素。例如它們可以搜索、排序、修改數(shù)據(jù)或者其他目的。算法使用迭代器,因此,一個(gè)算法只需被編寫一次就可以用于任意的容器,因?yàn)榈鞯慕涌趯?duì)所有類型的容器是通用的。這就是find()的位置

為了給算法更多的擴(kuò)展性,需要提供一些被算法調(diào)用的附屬函數(shù)??梢允褂猛ㄓ盟惴ㄈミm應(yīng)非常特別和復(fù)雜的需求。你可以提供自己的搜索標(biāo)準(zhǔn)或者特殊的操作去綁定元素。

STL的概念是將數(shù)據(jù)和操作獨(dú)立開來。數(shù)據(jù)由容器類管理,而操作是由可配置的算法定義。迭代器則是這兩個(gè)元素之間的線索。它允許任何算法和容器的交互。

在某種意義上,STL的概念有勃于面向?qū)ο缶幊痰某踔裕篠TL將數(shù)據(jù)和算法分離而非綁定它們。然而,這樣做的理由非常重要:原則上,你可以將任何容器同任何算法綁定,得到的結(jié)果是STL是非??蓴U(kuò)展的。

STL的一個(gè)標(biāo)準(zhǔn)是它支持任意數(shù)據(jù)類型。“標(biāo)準(zhǔn)模板庫”意味著,所有部分是適應(yīng)任意類型的模板。STL是通用編程的例子。容器和算法對(duì)任意類型和類都是通用的。

STL甚至提供更多的通用組件。使用 適配器 和函數(shù)體,你可以為特定需要補(bǔ)充、限制和配置算法和接口。

注意find不屬于vector的成員,而存在于算法中,應(yīng)加上頭文件#include <algorithm>

C++ vector 刪除符合條件的元素

包含頭文件:

#include <iostream>
#include <vector>
#include <algorithm>//注意要包含該頭文件

C++ vector中實(shí)際刪除元素使用的是容器vector中std::vector::erase()方法。

C++ 中std::remove()并不刪除元素,因?yàn)槿萜鞯膕ize()沒有變化,只是元素的替換。

1.erase( ) 刪除元素

函數(shù)原型:

iterator erase (iterator position);//刪除指定元素
iterator erase (iterator first, iterator last);//刪除指定范圍內(nèi)的元素

返回值:指向刪除元素(或范圍)的下一個(gè)元素。

(An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.)

對(duì)于c++里面的容器, 我們可以使用iterator進(jìn)行方便的遍歷. 但是當(dāng)我們通過iterator對(duì)vector/map等進(jìn)行修改時(shí), 我們就要小心了。

cplusplus的reference里對(duì) std::vector::erase 的描述是:

Iterators, pointers and references pointing to position (or first) and beyond are invalidated, with all iterators, pointers and references to elements before position (or first) are guaranteed to keep referring to the same elements they were referring to before the call.

由上可知,原有iter指針在刪除元素后會(huì)失效,之后的行為都變得不可預(yù)知.。

對(duì)于vector, erase會(huì)返回下一個(gè)iterator, 因此我們可以使用如下的方法:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
 vector<int> a = { 12, 23, 34, 45, 56, 67, 78, 89 };
 auto iter = a.begin();
 while (iter != a.end()) 
 {
  if (*iter > 30) 
  {
   iter = a.erase(iter);//用iter接收返回值
  }
  else //不要忘記這一段
  {
   ++iter;
  }
 }
 for (const auto &element : a) {
  cout << element << endl;
 }
 return 0;
}

實(shí)現(xiàn)代碼

例1. 用while循環(huán)查找并刪除一個(gè)元素

#include <vector>
using namespace std;
void main(void)
{
 vector<int> array;
 array.push_back(1);
 array.push_back(2);
 array.push_back(3);
 array.push_back(4);
 array.push_back(5);
 vector<int>::iterator itr = array.begin();
 while (itr != array.end())
 {
  if (*itr == 3)
  {
   itr = array.erase(itr);//刪除元素,返回值指向已刪除元素的下一個(gè)位置
  }
  else
  {
   ++itr;
  }
 }
}

例2. 用for循環(huán)遍歷刪除所有元素

#include <vector>
#include <iostream>
using namespace std;
int main()
{
        vector<int> test_vec;
        for (int i = 0; i<100;i++)
        {
                test_vec.push_back(i);
        }
        for(vector<int>::iterator it  = test_vec.begin(); it != test_vec.end(); )
         {
                 cout<<*(it)<<endl;
                 it = test_vec.erase(it);
        }
         return 0;
 }

例3. 刪除重復(fù)元素

若要求按照數(shù)據(jù)原來的順序,參照本文最后的代碼

若不要求按照數(shù)據(jù)原來的順序,可用:

sort(v.begin(),v.end());                           //unique只能比較相鄰元素是否重復(fù)
v.erase(unique(v.begin(), v.end()), v.end());      //unique將重復(fù)的元素移到末尾,返回末尾中第一個(gè)重復(fù)值的地址

2.find( ) 查找元素

官方文檔給出的定義:

find (STL)

在范圍中找到具有指定值的元素的第一個(gè)匹配項(xiàng)位置。

用于確定要在范圍中搜索的指定值第一次出現(xiàn)的位置的輸入迭代器。 如果找不到具有等效值的元素,則返回 last。

template<class InputIterator, class T> InputIterator find(InputIterator first, InputIterator last,        const T& val);

first

用于確定要在范圍中搜索其指定值的第一個(gè)元素的位置的輸入迭代器。

last

用于確定要在范圍中搜索其指定值的最后一個(gè)元素之后下一個(gè)元素的位置的輸入迭代器。

val

要搜索的值。

find() 函數(shù):在容器內(nèi)查找指定的元素,這個(gè)元素必須是基本數(shù)據(jù)類型的。

語法:find(arr.begin(), arr.end(), 50);第一個(gè)參數(shù)是array的起始地址,第二個(gè)參數(shù)是array的結(jié)束地址,第三個(gè)參數(shù)是需要查找的值。

如果想從指定位置開始查找,可以這樣寫:find(c.begin()+i+1, c.end(), c[i]);

其中i為自定義的位移量,結(jié)合for循環(huán)可以實(shí)現(xiàn)從當(dāng)前位置開始查找

查找成功:返回一個(gè)指向指定元素的迭代器

查找失?。悍祷豦nd迭代器

STL庫中,find( )源碼如下:

template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value)
{
 while (first != last && *first != value)
 {
  ++first;
 }
 ++first;
 return first;
}

用find查找并刪除一個(gè)元素

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> arr(100);//整型的array數(shù)組
int main()
{
 arr[20] = 50;//其余都是默認(rèn)值0
 vector<int>::iterator s = find(arr.begin(), arr.end(), 50);//第一個(gè)參數(shù)是array的起始地址,第二個(gè)參數(shù)是array的結(jié)束地址,第三個(gè)參數(shù)是需要查找的值
 if (s != arr.end())//如果找到,就輸出這個(gè)元素
 {
  cout << *s << endl;
 } 
 else//如果沒找到
 {
  cout << "not find!" << endl;
 }
 system("pause");
 return 0;
}

另外還有一個(gè)函數(shù): find_if函數(shù)

find_if函數(shù),帶條件的查找元素。

容器元素類型是類的時(shí)候,不能使用find函數(shù),只能通過find_if函數(shù)來實(shí)現(xiàn)。

find_if函數(shù)依次的遍歷容器的元素,返回第一個(gè)使函數(shù)為true的元素的迭代器;如果查找失敗則返回end迭代器。

3.remove()

std::vector沒有直接刪除特定值元素的成員方法。所以必須使用remove算法:

std::vector <Elem> coll;
//remove all elements with value val
coll.erase(remove(coll.begin(), coll.end(), val), coll.end());

remove()返回的是刪除后的尾部迭代器,必須調(diào)用erase()顯式地刪除其后的元素。

如果僅刪除第一個(gè)特定值元素:

std::vector <Elem> coll;
//remove first element with value val
std::vector<Elem>::iterator pos;
pos = find(coll.begin(), coll.end(), val);
if (pos != coll.end())
{
 coll.erase(pos);
}

4.代碼實(shí)例(一道牛客網(wǎng)練習(xí)題)

內(nèi)容:

輸入兩行字符c[ ], b[ ];

該程序把c[ ]中與b[ ]重復(fù)的元素全部刪除

并且把c[ ]本身內(nèi)部重復(fù)的元素也刪除(大小寫被一律轉(zhuǎn)化為大寫)

最后輸出剩余的不重復(fù)的元素

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	vector <char> c;
	vector <char> d;
	char keyBoard;
	//輸入c數(shù)組,用回車結(jié)束
	while (keyBoard = getchar())
	{
		if (keyBoard == '\n')break;
		c.push_back(keyBoard);
	}
	//輸入d數(shù)組,用回車結(jié)束
	while (keyBoard = getchar())
	{
		if (keyBoard == '\n')break;
		d.push_back(keyBoard);
	}
	//c-d:c,d數(shù)組對(duì)比,刪除c數(shù)組中與d數(shù)組相同的元素
	vector<char>::iterator iter = c.begin();
	int i;
	for (i = 0; i < d.size(); i++)
	{
		iter = find(c.begin(), c.end(), d[i]);
		if (iter != c.end())
		{
			c.erase(iter);
		}
	}
	//把c數(shù)組中剩余的小寫字母轉(zhuǎn)換為大寫,其余字符不變
	for (i = 0; i < c.size(); i++)
	{
		if (c[i] >= 'a'&&c[i] <= 'z')
		{
			c[i] -= 32;
		}
	}
	//刪除c數(shù)組中的重復(fù)元素
	for (i = 0; i < c.size(); i++)
	{
		iter = find(++(find(c.begin(), c.end(), c[i])), c.end(), c[i]);//巧妙用++,從第一個(gè)想要查找的元素開始查找,刪除后面的,保留第一個(gè)
		if (iter != c.end())
		{
			c.erase(iter);
			i--;
		}
	}
	//輸出c數(shù)組中的所有元素
	for (i = 0; i < c.size(); i++)
	{
		cout << c[i];
	}
	return 0;
}

補(bǔ)充:C++ STL vector容器元素的查找和搜索 find() find_if()函數(shù)的使用

看代碼吧~

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std; 
void print(const int& temp){
    cout<<temp<<endl;
}
 
int main()
{
    const int ARRAY_SIZE=8;
    int IntArray[ARRAY_SIZE]={1,2,3,4,5,6,7};
    vector<int> myvt;
    vector<int>::iterator location_index;
    for(int i=0;i<8;++i){
        myvt.push_back(IntArray[i]);
    }
    for_each(myvt.begin(),myvt.end(),print);
    location_index=find(myvt.begin(),myvt.end(),2);  //find函數(shù)
    cout<<"數(shù)字2的下標(biāo)是:"<<(location_index-myvt.begin())<<endl;
    location_index=find_if(myvt.begin(),myvt.end(),bind2nd(greater<int>(),5));
    cout<<"第一個(gè)大于5的數(shù)字的下標(biāo)是:"<<(location_index-myvt.begin())<<endl;
    return 0;
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

最新評(píng)論