检查在vector的vector中搜索时std::find是否失败

examining if std::find fails while searching in a vector of vectors

本文关键字:vector 失败 find 是否 std 搜索 检查      更新时间:2023-10-16

我面临的问题是,std::find返回<someVector>.end(),如果它失败了,但如果你不知道<someVector>呢?

要搜索的结构:hashtable (X类向量的向量H)外向量H的索引i是用哈希函数找到的std::find用于搜索H[i]函数签名:<return val> lookup (hashtable H,) [<return val>是通过查找找到的元素的句柄,因此我们可以根据需要更改它的值]

vector<X>::iterator lookup (vector <vector <X>> &H, X some_value)
{
     int index = hashFn(some_value);
    return std::find(H[index].begin(), H[index].end(), some_value);
}

我如何检查在这种情况下,如果查找失败??(如果我将向量更改为数组/指针,我可以简单地返回NULL并完成交易,但是当返回迭代器时我如何做到这一点??)

std::find(a,b, V)不返回.end();它返回第二个参数。因为你,调用者,传递了那个实参,你总是知道的。

现在,在更复杂的示例中,问题似乎是std::find()的调用者应该返回给其调用者的内容。这是我们不能说的;我们连签名都不知道。你可以返回一个默认构造的空向量(参见Monish的答案)。您可以抛出异常(如果在概念上有意义的话)。可以将const引用返回给静态空向量。

如果不能访问vector本身,那么使用迭代器唯一能做的就是检索该迭代器所指向的元素。那么为什么不返回const X*或X*来代替vector::iterator呢?在失败的情况下,你可以只返回0(或nullptr,如果你使用c++ 11)。这是关于界面的。那么在你的搜索算法中检测std::find失败的方法呢?——我同意MSalters的观点——在你的代码中有一个std::find调用,有可用的参数——所以你可以把结果与那个地方的第二个参数进行比较,并返回0指针。

X * lookup ( vector <vector <X>> &H, X some_value )
{
  int index = hashFn(some_value);
  vector<X> &v = H[index];
  const vector<X>::iterator result = std::find( v.begin(), v.end(), some_value );
  if ( result != v.end() ) {
    return &(*result);
  } else {
    return 0;
  }
}

用法:

X * value = hash_table.lookup(...);
if ( X != 0 ) {
  // use result
} else {
  // value not found
}

并且,如果不能访问vector,则不能以其他任何方式使用迭代器,因此使用vector::iterator作为查找的返回类型是没有意义的;

如果返回类型为vector,则在查找失败的情况下可以返回空vector。

返回vector ();