2017-03-25 67 views
0

這裏是我的2個結構來展示我的問題。我有一個具有列的矢量表如何使用多個成員的自定義對象的向量上查找

struct column{ 
    string col_name; 
    int index; 
}; 

struct table{ 
    vector<vector<stuff>> rows; 

    vector<column> columns; 
}; 

我想要做的就是搜索,如果我表的一個對象有用繩子COL_NAME我感興趣的

我試圖使用std :: find,但我很難將語法放在一起。

說我有

vector<table> all_tables; 

如何我會檢索一個表(可以說表索引0),看看它是否包含燻肉COL_NAME

到目前爲止,我有

find(all_tables[0].columns 

而這正是我卡住了。列是一個向量,它需要一個索引,但我不確定給出的索引。我只是做columns.begin()?這似乎並不正確,因爲我有多個成員變量。我真的想要查看列的開頭和列的末尾,以查找它是否具有我正在感興趣的正確字符串(不是int index)。

我瞭解find的語法通常是find(v .begin(),v.end(),「bacon」),但我不知道如何在這種情況下使用它。

我將不勝感激。謝謝!

----例如-----

我有分別與一個名爲 「蛋糕」, 「蘋果」 3列的表, 「臘肉」。所以在我的表結構中矢量列的大小是3。我希望能夠簡單地通過表索引來搜索列向量,如果它包含具有我感興趣的名稱的列。

+0

非常類似於http://stackoverflow.com/questions/589985/vectors-structs-and-stdfind – user4581301

+0

你可以使用lambda嗎?如果是,然後檢查我的解決方案:http://cpp.sh/6xow2 – JustRufus

+1

或看到這個解決方案:http://cpp.sh/6xeaa沒有lamdba – JustRufus

回答

2

您需要的是std::find_if - 它允許您指定任何條件爲一個可調用的參數,而不是僅僅一個值來比較:

std::find_if(all_tables[0].columns.begin(), all_tables[0].columns.end(), 
      [](const column& c){ return c.col_name == "bacon";}); 

這裏的最後一個參數是返回bool拉姆達。 find_if將應用於範圍內的所有column s,直至找到滿足lambda(c.col_name == "bacon")中的條件的一個。

您可以在這裏傳遞任何可調用對象而不是lambda,例如std::function或者你可以定義你自己的閉包類,使用lambda可能是最方便的方法。

注意std::find做同樣的事情std::find_if,它只是默認爲operator==作爲條件,所以另一種方式去是定義operator==爲你的類是這樣的:

struct column{ 
    string col_name; 
    int index; 

    bool operator==(const column& c) const 
    { return col_name == c.col_name; } 

}; 

,然後只用普通std::find()

column sample{"bacon"}; 
std::find(all_tables[0].columns.begin(), all_tables[0].columns.end(), sample); 

也許你column對象應該認爲是平等的,當他們col_name s是一樣的,那麼這第二種方式可能更可取。否則,可能會更安全,不要與operator==混淆。這取決於您的類型邏輯,由您決定。

相關問題