【问题标题】:Search for a variable from vector of objects从对象向量中搜索变量
【发布时间】:2017-12-22 12:00:35
【问题描述】:
struct ABC
{
int a;
string b;
};

我有一个指向上述结构的对象向量。并想根据变量“b”搜索向量?

我的逻辑如下。

vector<ABC> vec = ...;//vec has my objects
for(vector<ABC>::iterator it = vec.begin();
        it != vec.end();
        ++it)
    {
        if(search_str == (it->b))//search string is my string which i need to search
        {
        }
    }

我已经对上面的代码进行了广泛的测试,并且它可以工作。我想知道是否有更好的方法来实现这一点。也许使用 find()。

【问题讨论】:

  • 这可以在现代 C++ 中的一行代码中完成:std::find_if(vec.begin(), vec.end(), [&amp;](const auto &amp;e) { return e.b == search_str});
  • 你想要什么输出?第一场比赛,如果有的话?所有匹配项目的新容器?还有什么?
  • 我想要第一个匹配的迭代器。这样我就可以使用迭代器来提取值。
  • @SamVarshavchik 我在视觉工作室 2012 中不允许使用自动操作
  • @arjunjawalkar 你有C++11.?

标签: c++ vector stl-algorithm


【解决方案1】:

简单易读,取自Sam's comment:

auto found = std::find_if(vec.begin(), vec.end(), [&](auto const &e) {
    return e.b == search_str;
});

现在found 是第一个匹配元素的迭代器,如果没有找到则vec.end()。

【讨论】:

    【解决方案2】:

    在某些情况下,您还可以使用基于范围的 for 循环,让您的代码更加清晰。

    for (auto const &p : vec)
    {
        if (p == search_str)
        {
            //--- Handle the find ---//
    
            //if you want to stop...
            break; 
        }
    }
    

    【讨论】:

      【解决方案3】:

      比较两个字符串的更好方法之一是在 C++ 中使用 compare 方法。

      假设你想比较两个字符串 S1 和 S2。
      您可以像以前一样使用equality operator( == )。

      但是使用std::string::compare() 函数有它自己的好处。
      我们不仅可以比较两个字符串,还可以检查一个字符串的大小。

      std::string::compare() 函数返回一个int:

      • 如果S1 等于S2,则为零。
      • 如果S1 小于S2,则小于零。
      • 如果S1 大于S2,则大于零。

      所以你的代码可以格式化为:

      vector<ABC> vec = ...;//vec has my objects
      for(vector<ABC>::iterator it = vec.begin(); it != vec.end(); ++it){
          if(!search_str.compare(it->b))
          {
            //match found
          }
      }
      

      【讨论】:

      • 如果你完全不使用compare“更好”返回的附加信息如何?
      • 在这种情况下几乎是一样的。我已经指出了另一种按要求搜索字符串的方法。告诉其他功能没有害处。更好的是,如果将来您需要检查更多或更少,那么您的代码将更加模块化。
      猜你喜欢
      • 1970-01-01
      • 2013-03-09
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多