假设我有一个std::vector<std::pair<int, std::vector<int> > >
,也就是说,包含一对向量的向量的向量。 (我知道我可以用地图来实现同样的目的,但那不是我要的)
如何使用STL搜索int(对中的那个)?我写了一个有效的解决方案:
struct FindFirst {
FindFirst(int i) : toFind(i) { }
int toFind;
bool operator()
( const std::pair<int, std::vector<int> > &p ) {
return p.first==toFind;
}
};
可以这样使用:
int valueToFind = 4;
std::find_if(myVec.begin(), myVec.end(), FindFirst(valueToFind));
但它看起来像这样有点难看;肯定有更好的办法。 那么更好这样做的方法没有使用C ++ 0x或Boost中的任何内容? (因为我正在努力学习最好的方法,而且我强调,只有 STL )
编辑: 看起来对我的要求有点混乱。我更感兴趣的是在仿函数上使用构造函数来获取搜索值是不好的做法,尤其是当它们在STL算法中使用时。
答案 0 :(得分:4)
当仅使用STL时,这是最好的方法。究竟你不喜欢它(除了它的冗长之外)?
它是多功能的,因为您可以使用其他算法,例如std::binary_search
。
它非常简单直接(至少对于习惯于C ++仿函数的人来说)。
这里真正改进的唯一方法是选择数据结构。这些用例由std::map
涵盖,您没有解释为什么不能使用它。我知道,对于您真正的问题,地图可能不适合,但在这种情况下,您的示例并不代表您的实际问题。你应该解决这个问题。
答案 1 :(得分:1)
为什么不使用直接STL调用
void FindFirst(std::vector<std::pair<int, std::vector<int> > >& v, int intToLookFor)
{
std::vector<std::pair<int, std::vector<int> > >::iterator iItr;
for (iItr = v.begin(); iItr != v.end(); ++iItr)
{
if (iItr->first == intToLookFor) return;
}
}
(抱歉变量名称;-))。 此函数的返回值也可以是迭代器,也可以是向量值的引用...
答案 2 :(得分:1)
不,将参数传递给谓词函数并不是一个坏习惯。实际上,这使得谓词非常灵活。
替代方案是使用全局变量 - 我将其称为用于谓词的不良做法。