检查在vector的vector中搜索时std::find是否失败
examining if std::find fails while searching in a vector of vectors
我面临的问题是,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
();
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 为什么这个分配给 std::vector 索引会失败?
- 从 std::vector<double> 到 Python 列表的转换失败(提升 python)
- 如果我在下面的代码中使用 list 而不是 vector,为什么在我尝试在迭代器之间执行减法的行中编译失败?
- 使用 boost::序列化序列化 std::vector of unique_ptr 在 Linux 上失败
- 编译器在将 std::unique_ptr 推回 std::vector 时不会失败
- std::vector<std::vector<int>>:调试断言失败。C++矢量下标超出范围保留内存
- 标准::复制失败,"cannot seek vector iterator after end"
- 为什么这个 std::vector::emplace_back 失败了?
- C++迭代器作为 lambda 函数中的参数,断言失败:"vector iterators incompatible"
- C++ for-each 语句触发"vector iterators incompatible"断言失败:this->_Getcont() == 0
- 将std::vector作为模板模板参数传递时出错-在GCC中有效,在MSVC中失败
- 调试断言失败!vector.earse() 调用期间出错
- 为什么“vector<int>(v1);”语句失败
- std::vector 在代码拆分后引用要推送的对象失败
- std::vector push_back 在并行 for 循环中使用时失败
- 调试断言失败:下标超出 std::vector 的范围
- vector中的pushback失败,malloc无法分配更多内存
- 使用下标运算符进行Integer Vector元素比较失败,但使用at函数成功
- Shared_ptr压入vector失败.处理步骤