1. 程式人生 > 程式設計 >C++中檢查vector是否包含給定元素的幾種方式詳解

C++中檢查vector是否包含給定元素的幾種方式詳解

概述

在編碼中經常會遇到一種場景,就是要在陣列或列表中查詢某個元素是否存在,其實對於這種線性操作,自己實現一個迴圈來檢查是非常簡單的事情,那既然這樣,為啥還要專門寫篇部落格來分享呢?
一個最重要的原因就是我們原本就可以用更簡潔直觀高效的方式去替代手寫for迴圈,這個方式就是使用C++標準庫函式。

再囉嗦幾句。
通常在面試的時候,為了考察面試者的編碼功底,會讓其從頭實現某些基礎的演算法,但是在實際開發中,很多東西都有現成的封裝。只有把語言、標準庫“雙劍合璧”才能算是真正的C++。而且據C++標準委員會的安排,今後C++也會更側重於擴充庫而不是擴充語言,可見其分量的輕重了。

總之,C++標準庫是一個非常強大的東東,並且實現這些標準庫的人都是些非常牛逼的頂級程式設計師,效能都是最優的。所以不要總想著所有事情都親力親為的去寫一遍,既浪費時間,寫出來的東西可能還很菜。那麼,這裡就通過一些簡單的示例來演示如何通過標準庫函式來實現。

正文

如何檢查vector中是否包含給定元素。

std::count

最簡單的方式是對vector中的指定元素進行計數,如果count不為零,表示該元素存在,那麼std::count可以很容易實現。

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
	std::vector<int> v = { 1,20,2,6,3,7 };
	int key = 6;

	if (std::count(v.begin(),v.end(),key))
		std::cout << "Element found";
	else
		std::cout << "Element not found";

	return 0;
}

std::find

相比第一種方式,std::find()演算法能夠更快速的查詢給定範圍內的值,因為std::count()會變數整個容器以獲得元素計數,而find()在找到匹配元素後就立即停止搜尋。

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
	std::vector<int> v = { 1,7 };
	int key = 6;

	if (std::find(v.begin(),key) != v.end())
		std::cout << "Element found";
	else
		std::cout << "Element not found";

	return 0;
}

std::find_if

和find相似的還有一個叫 std::find_if()演算法,如果查詢需要滿足某些條件,那麼推薦使用該方法。這裡我們可以結合lambda來使用,非常簡潔。

比如,要查詢列表中是否有元素能被5整除

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
  auto lst = {1,4,9,5,11};
  if(std::find_if(lst.begin(),lst.end(),[](auto v){
    if(v%5 ==0)
      return true;
    else
      return false;
  }) != lst.end()){
    std::cout << "Element found";
  }
  else{
    std::cout << "Element not found";
  }
  return 0;
}

C++ 11 - std::any_of

該演算法與std::find_if相似,但不是返回滿足條件的的序列中第一個元素的迭代器,而是如果任何元素滿足條件後返回true,否則返回false。

#include <iostream>
#include <vector>
#include <algorithm>

struct compare
{
	int key;
	compare(int const &i): key(i) { }

	bool operator()(int const &i)
	{
		return (i == key);
	}
};

int main()
{
	std::vector<int> v = { 4,7,9 };
	int key = 6;

	if (std::any_of(v.begin(),compare(key)))
		std::cout << "Element found";
	else
		std::cout << "Element not found";

	return 0;
}

或者直接修改find_of的案例:

int main()
{
  auto lst = {1,11};
  if(std::any_of(lst.begin(),[](int v){
    if(v%5 ==0)
      return true;
    else
      return false;
  })){
    std::cout << "Element found";
  }
  else{
    std::cout << "Element not found";
  }
  return 0;
}

C++ 11 - std::none_of

該演算法剛好和any_of相反,如果給定的條件在範圍內所有元素都返回false,則返回true,如果至少一個元素返回true,則返回false。

直接修改上述示例,將if條件改成“非”就可以了,不再贅述。

std::binary_search

最後一種方法,如果vector是有序的,那麼可以考慮使用這種演算法,如果在給定範圍內找到元素,則返回true,否則返回false。該方式是採用二分法查詢,時間複雜度為O(log(n)),速度比較快。

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
	std::vector<int> v = { 1,7 };
	int key = 4;

	if (std::binary_search(v.begin(),key))
		std::cout << "Element found";
	else
		std::cout << "Element not found";

	return 0;
}

OK,以上所有方法都可以實現我們想要的結果,只是在不同情況下選擇一種自己喜歡的方式即可。

附:
C++介面文件:https://en.cppreference.com/w/
C++演算法庫介紹:https://en.cppreference.com/w/cpp/algorithm

到此這篇關於C++中檢查vector是否包含給定元素的幾種方式的文章就介紹到這了,更多相關C++檢查vector是否包含給定元素內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!