这是我的两个结构来展示我的问题。我有一个包含列向量的表
struct column{
string col_name;
int index;
};
struct table{
vector<vector<stuff>> rows;
vector<column> columns;
};
我想要做的是搜索我的表格对象中是否有列,字符串 col_name 我感兴趣。< / p>
我正在尝试使用 std :: find ,但我很难将语法放在一起。
说我有
vector<table> all_tables;
我如何搜索表格(比如说索引0处的表格)以查看它是否包含培根作为 col_name ?
到目前为止我已经
了 find(all_tables[0].columns
这就是我被困住的地方。 columns是一个向量,它想要一个索引,但我不确定要给出什么索引。我只是做columns.begin()吗?这似乎不正确,因为我有多个成员变量。我真的想看看列的开头和列的结尾,以查找它是否有正确的字符串(而不是int index)我感兴趣。
我理解find的语法通常是find(v.begin(),v.end(),“bacon”),但我不知道在这种情况下如何使用它。
我很感激一些帮助。谢谢!
---- -----示例
我有一个包含3列的表,分别名为“pie”,“apple”和“bacon”。因此,我的表结构中向量列的大小为3。我希望能够,仅仅根据表索引,搜索它的列向量,如果它包含一个名为我感兴趣的列。
答案 0 :(得分: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
的lambda。 find_if
会将其应用于范围内的所有column
,直到找到满足lambda(c.col_name == "bacon"
)条件的std::function
。
您可以在此传递任何可调用对象而不是lambda,例如std::find
或者您可以定义自己的闭包类,但使用lambda可能是最方便的方法。
请注意,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
相同时,operator==
个对象应该认为是相同的,那么第二种方式可能更合适。否则,不要混淆{{1}}可能更安全。由您决定,具体取决于您的类型逻辑。