2011-06-07 33 views
0

由於隨機訪問數組中的各個元素的要求,我在我的代碼中使用了一個向量用於幾個數組。有些用戶GUI操作需要通過陣列搜索(但不足以保證使用的std::map),通過代碼,使散落的是:簡化向量的查找操作

if (std::find(array.begin(), array.end(), searchfor) != array.end()) { ... } 

我想的做的更好,更易於閱讀方式這可能會創建一個方法,以便我可以執行類似if (array_find(searchfor) != array.end())或者甚至可以擴展向量,所以我可以做if (array.find(searchfor) != array.end())

我不確定最好的辦法。有任何想法嗎?

+2

**不要擴展'vector'。**擴展意味着繼承。沒有虛擬教室的班級的繼承是純粹的邪惡。即使'vector'有一個虛擬的dtor,你也不想爲了增加一個無狀態的操作而繼承子類。 – 2011-06-07 22:56:40

回答

3

使用任何你喜歡的。我相信做一個功能更好,但它避免了創建一個新類並在任何地方使用它的麻煩。例如:

bool array_contains(searchFor) 
{ 
    return std::find(array.begin(), array.end(), searchfor) != array.end(); 
} 
+0

你甚至可以用'array_contains'作爲模板函數,它接受任何STL兼容的容器,並運行搜索。 – Node 2011-06-07 22:49:35

+0

@Node:絕對!根據他的需要,OP可能會改進這一點。 – 2011-06-07 22:57:28

0

除非您希望在適當的情況下(如本例)重寫整個標準庫以使用範圍,並確保您使用的每個人也都這樣做,那麼第一個發佈的代碼是最好的。

2

您可能會發現Boost.Range值得一看。基本上,你可以使用集合引用來取消開始/結束調用作爲參數。

#include <boost/range/algorithm/find.hpp> 
... 
if (boost::find(array, searchfor) != array.end()) { ... } 

該解決方案的優點是您仍然可以獲得迭代器,這經常證明是有用的。