如何在具有多个成员的自定义对象的向量上使用find

时间:2017-03-25 05:15:35

标签: c++ vector struct

这是我的两个结构来展示我的问题。我有一个包含列向量的表

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。我希望能够,仅仅根据表索引,搜索它的列向量,如果它包含一个名为我感兴趣的列。

1 个答案:

答案 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_ifoperator==的功能相同,只是默认为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}}可能更安全。由您决定,具体取决于您的类型逻辑。