2011-06-07 49 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()) { ... } 

该解决方案的优点是您仍然可以获得迭代器,这经常证明是有用的。