2011-10-11 49 views
1

我面臨的問題是std::find返回<someVector>.end()如果它失敗了,但如果你不知道如何<someVector>?檢查如果std :: find在矢量向量中搜索失敗

結構進行搜索:使用散列函數 std::find用於通過H [I] 函數簽名來搜索被發現外向量H的 的索引(i)hashtable(類X的向量的向量H):<return val>查找(哈希表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和處理完成,但如何返回迭代器,當我做到這一點?)

+10

不要說'stl :: find',它是'std :: find'。 –

+2

我不明白你的問題。如果沒有找到該值,'std :: find'會返回您傳遞給它的第二個迭代器參數(這通常是,但不必是'.end()')。所以只要檢查一下,看看'std :: find'是否失敗。如果你想獲得不同的東西,請稍微改述一下你的問題。 –

+0

如果你提供你的代碼,理解你會更容易。 –

回答

0

如果返回類型爲矢量<X>,那麼你就可以在查找失敗的情況下返回空向量。

返回向量<X>();

4

std::find(a,b, V)不返回.end();它返回第二個參數。既然你,調用者通過了這個論點,你總是知道這一點。

現在,在您的更復雜的示例中,看起來問題是std::find()的調用者應該返回給調用者的問題。這是我們無法真正說的;我們甚至不知道簽名。你可以返回一個空矢量,默認構造(參見Monish的答案)。你可以拋出一個異常(如果這在概念上是有道理的)。您可以將一個const引用返回給一個靜態的空向量。

+0

理想情況下,我想返回類型爲矢量 ::迭代器,因爲我想處理對象上的句柄,所以我可以操縱那個特定的元素..我不知道一個空的矢量將如何幫助我這裏 ... – Karan

+0

我不想在這裏做的兩件事是:a)返回一個元組(傳遞/失敗,句柄)b)傳遞迭代器作爲參數返回並聲明它失敗,如果迭代器在函數調用(我可以在這種情況下傳遞 .end) – Karan

+0

@Karan W/o能夠訪問向量本身,你可以用迭代器做的唯一事情就是檢索這個迭代器指向的元素。那麼爲什麼你不想返回const X *或X *而不是向量 :: iterator?如果失敗,你可能只返回0(或者如果你使用C++ 11,則返回nullptr)。這是關於界面。你可以在你的搜索算法中檢測std :: find失敗的方式 - 我同意MSalters - 你的代碼中的std :: find調用中有可用的參數 - 所以你可以將結果與第二個參數進行比較,在平等上返回零指針。 –

2

無法訪問向量本身,您可以使用迭代器做的唯一事情就是檢索此迭代器指向的元素。那麼爲什麼你不想返回const X *或X *而不是vector :: iterator?如果失敗,你可能只返回0(或者如果你使用C++ 11,則返回nullptr)。這是關於界面。你可以在你的搜索算法中檢測std :: find失敗的方式 - 我同意MSalters - 你的代碼中的std :: find調用中有可用的參數 - 所以你可以將結果與第二個參數進行比較,在平等上返回零指針。

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 
} 

又一次 - 你將無法使用迭代器以任何其他方式的W/O訪問矢量,所以它是沒有意義的使用矢量::迭代器作爲查找的迴歸類型;

+0

我認爲&(*結果)不是安全的東西(或一個很好的做法),反正我會嘗試這種方法 – Karan

+0

看不到任何可能是不安全的原因。 '結果'保證是有效的迭代器,它指向向量的元素之一。另外*結果返回X&值。所以&(* result)將只是指向vector元素的指針。 AFAIK優化打開向量 ::迭代器是一個指針。如果有人有其他信息,請糾正我。 –

+0

謝謝,這個作品 – Karan