【问题标题】:Search vectors in returned iterator在返回的迭代器中搜索向量
【发布时间】:2013-03-23 22:43:37
【问题描述】:

上下文: 我在 map 上使用 std::string 执行 std::find。然后它返回一个向量迭代器,我将返回的迭代器保存在一个常量迭代器中。

问题: 我现在想遍历返回的 const-iterator,并字符串比较索引 0 处的每个向量。所以类似于:

while (iterator != map.end())
    if ( myStr == iterator.at(0) )
        break;
    else
        iterator++

这种方法对我来说效果很好,我想知道是否有更优雅的方法可以做到这一点,我错过了什么吗?

感谢您对此的帮助 =]

【问题讨论】:

  • 如果它有效并且对你没问题,我看不出问题。我也觉得不错。
  • 是的,它有效,但我想知道是否有任何我可以使用的 stl 魔法,让它变得更好。
  • 我不这么认为,但无论如何,为什么 STL 魔法会让它变得更好?如果你的意思是我认为你所说的 STL 魔法,那么它无论如何都被过度使用了。我的意思是你可以使用 std::find_if (或其他东西),但为什么要打扰。只是让代码更复杂,更不容易理解(当然这是个人意见)。
  • 我想你是对的,无论如何它必须是线性搜索。我只是想知道是否可以将仿函数传递给搜索算法。但我没有找到任何这样的东西=[
  • 我认为您可以将函子传递给搜索算法。问题是这是否会有所改善。在我看来,不,但其他人会不同意。

标签: c++ map vector iterator find


【解决方案1】:

我可以想象一种非常糟糕的方式。这不是普通的,应该(甚至必须)永远不要使用。重载向量的比较运算符,因此它只会比较 0 个位置。然后使用 map::find() 方法。只是好玩。

【讨论】:

    【解决方案2】:

    您可以使用std::find_if():而不是显式编码搜索:

    std::vector<std::vector<std::string>> vstring
        {
            { "no",   "yes"   },
            { "help", "yes"   },
            { "true", "false" }
        };
    
    const std::string myStr = "help";
    auto f = std::find_if(vstring.begin(), vstring.end(),
                [&](std::vector<std::string>const & vs)
                {
                    return !vs.empty() && myStr == vs[0];
                });
    
    
    if (f != vstring.end())
    {
        // Found.
    }
    

    http://ideone.com/nkI7fk 上查看演示。

    【讨论】:

      【解决方案3】:

      让这个更“优雅”的一种方法是这样的:

      // C++11 allows `using` to be used instead of `typedef`
      using map_type = std::map<std::string, std::vector<some_type>>;
      
      // First find the starting point of our secondary search
      const auto itr = map.find(some_string);
      
      // Do secondary search
      const auto found = std::find_if(itr, map.end(),
                                      [](const map_type::value_type& pair)
                                      {
                                          return (!pair.second.empty() &&
                                                  pair.second[0] == myStr);
                                      });
      if (found != map.end())
      {
          // Found the item
      }
      

      【讨论】:

      • 我错过了什么,你为什么要从找到的元素搜索到地图的末尾?
      • @Dave 好吧,这就是 OP 似乎正在做的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      相关资源
      最近更新 更多